Cuando configuro la IFS
variable en un espacio, bash
trata los espacios múltiples como un espacio ( myprogram
es un programa que imprime los argumentos de la línea de comandos que recibe):
IFS=" "
x="hello hi world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world
Pero cuando configuro la IFS
variable como una coma, bash
no trata las comas múltiples como una coma:
IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] =
argv[3] =
argv[4] = hi
argv[5] =
argv[6] =
argv[7] = world
¿Porqué es eso?
Respuestas:
Esto está documentado en
man bash
. Una sola aparición de cualquier carácter en IFS que no sea un espacio en blanco delimita un campo.De
man bash
:Ejemplos: división de campo
Si IFS no tiene caracteres de espacio en blanco, entonces el espacio en blanco se incluye en los campos:
Si IFS tiene espacios en blanco y una coma, entonces las secuencias de espacios en blanco, seguidas de una coma, seguidas de secuencias de espacios en blanco, se tratan como un delimitador único:
Las secuencias de comas se interpretan como secuencias de campos vacíos:
Ejemplos: espacios en blanco iniciales y finales
Si IFS no contiene espacios en blanco, los espacios en blanco iniciales y finales se mantienen en los campos:
Si IFS contiene espacios en blanco, se eliminan las secuencias de espacios en blanco iniciales o finales:
fuente
awk
con la-F'\t'
opción ocut
. Alternativamente, si tiene una versión reciente debash
, puede analizar los campos usandoreadarray
la-d$'\t'
opción.