URL: https://linuxfr.org/forums/programmation-shell/posts/ifs-et-imbrication Title: IFS= et imbrication Authors: Marotte ⛧ Date: 2015年01月16日T15:35:42+01:00 License: CC By-SA Tags: Score: 0 Bonjour, J'ai un fichier CSV avec des lignes du genre : ``` AEQF;bla;bli;blu;ju;jo;toto;foo|bar|baz SEQI;hik;hop;kii;ji;ju;titi;fii|gii|hop ``` Je souhaite parcourir chaque ligne, mettre chaque champ dans un tableau et traiter le dernier champ de manière particulière en le « splitant » à son tour. Voici le code : ```bash # Boucle sur le tableau "lines", pour chaque élément définition d'un tableau "fields" for l in "${lines[@]}" do while IFS=';' read -a fields do case "${fields[0]}" in "AEQF") while IFS='|' read -a hostgroups do for hg in "${hostgroups[@]}" do echo "HG;ADD;${hg};${hg}"; done done <<< "${fields[7]}" echo "HOST;ADD;${fields[2]};${fields[4]};${fields[3]};${fields[6]};${fields[1]};${fields[7]}" ;; "SEQI") echo "HOST;DEL;${fields[2]}" ;; *) echo "Problem!" ;; esac done <<< "$l" done ``` Certains se seront peut-être rendu compte qu'en fait je m'efforce de générer un fichier que CLAPI (Centreon Command Line API) pourra importer, à partir de fichiers CSV générés par un outil maison... Mon problème est que si la valeur d'un champ possède des espaces ça ne fonctionne pas :( ``` [stef@459ETU1 ]# cat test1 AEQF;bla;bli;blu;ju;jo;toto;foo|bar|baz SEQI;hik;hop;kii;ji;ju;titi;fii|gii|hop [stef@459ETU1 ]# cat test2 AEQF;bla bla;bli;blu;ju;jo;toto;foo|bar|baz SEQI;hik;hop;kii;ji;ju;titi;fii|gii|hop [stef@459ETU1 ]# ./clapi_import.sh test1 HG;ADD;foo;foo HG;ADD;bar;bar HG;ADD;baz;baz HOST;ADD;bli;ju;blu;toto;bla;foo|bar|baz HOST;DEL;hop [stef@459ETU1 ]# ./clapi_import.sh test2 HOST;ADD;;;;;bla; Problem! HOST;DEL;hop [stef@459ETU1 ]# ``` Au départ, à la place des ```bash while IFS=';' read -a toto do ... done <<< "$var" ``` j'avais utilisé des ```bash IFS=';' && fields=($var) ``` mais le problème est le même. Une idée ? Je suis bien entendu ouvert à toute proposition, je ne tiens pas plus que ça à réussir à imbriquer des IFS= :) Donc d'une manière générale, comment doit-on appréhender ces fichiers CSV avec « deux niveaux de séparateurs » en bash (3.2.25) ? En plus à foutre tout ça dans un _case_, comment dire... je sens que je me fourvoie !

AltStyle によって変換されたページ (->オリジナル) /