Lorsque je définit la IFS
variable sur un espace, bash
traite plusieurs espaces comme un seul espace ( myprogram
est un programme qui imprime les arguments de ligne de commande qu'il reçoit):
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
Mais quand je mets la IFS
variable à une virgule, bash
ne traite pas plusieurs virgules comme une virgule:
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
Pourquoi donc?
Réponses:
Ceci est documenté dans
man bash
. Une seule occurrence de n'importe quel caractère dans IFS qui n'est pas un espace délimite un champ.De
man bash
:Exemples: division de champ
Si IFS n'a pas de caractères d'espaces, alors les espaces sont inclus dans les champs:
Si IFS a à la fois des blancs et une virgule, les séquences de blancs, suivies d'une virgule, suivies de séquences de blancs sont traitées comme un seul délimiteur:
Les séquences de virgules sont interprétées comme des séquences de champs vides:
Exemples: espaces blancs de début et de fin
Si IFS ne contient aucun espace, tous les espaces de début et de fin sont conservés dans les champs:
Si IFS contient des blancs, toutes les séquences de blancs de début ou de fin sont supprimées:
la source
awk
avec l'-F'\t'
option oucut
. Si vous avez une version récente debash
, vous pouvez également analyser les champs à l'aidereadarray
de l'-d$'\t'
option.