Los siguientes subprocesos en este sitio y StackOverflow fueron útiles para comprender cómo IFS
funciona:
- ¿Qué es IFS en el contexto del bucle for?
- Cómo recorrer las líneas de un archivo
- Bash, leer línea por línea del archivo, con IFS
Pero todavía tengo algunas preguntas cortas. Decidí preguntarles en la misma publicación ya que creo que puede ayudar mejor a futuros lectores:
P1. IFS
normalmente se analiza en el contexto de la "división de campos". Es división de campo lo mismo que división de palabras ?
P2: La especificación POSIX dice:
Si el valor de IFS es nulo, no se realizará división de campos.
Está configurando IFS=
lo mismo que establecer IFS
a nulo? ¿Es esto lo que significa establecerlo en una empty string
? ¿también?
Si IFS no está configurado, el shell se comportará como si el valor de IFS fuera <space>, <tab> and <newline>
Digamos que quiero restaurar el valor predeterminado de IFS
. ¿Cómo puedo hacer eso? (más específicamente, ¿cómo me refiero a <tab>
y <newline>
?)
while IFS= read -r line
do
echo $line
done < /path_to_text_file
se comportan si cambiamos la primera línea a
while read -r line # Use the default IFS value
o a:
while IFS=' ' read -r line
Respuesta aceptada:
- Sí, son iguales.
- Sí.
- En bash y shells similares, podría hacer algo como
IFS=$' tn'
. De lo contrario, podría insertar los códigos de control literal usando[space] CTRL+V [tab] CTRL+V [enter]
. Sin embargo, si planea hacer esto, es mejor usar otra variable para almacenar temporalmente el antiguoIFS
valor, y luego restaurarlo después (o anularlo temporalmente para un comando usando el comandovar=foo command
sintaxis). - El primer fragmento de código colocará la línea completa leída, palabra por palabra, en
$line
, ya que no hay separadores de campo para realizar la división de palabras. Sin embargo, tenga en cuenta que dado que muchos shells usan cstrings para almacenar cadenas, la primera instancia de un NUL aún puede causar la apariencia de que finaliza prematuramente. - Es posible que el segundo fragmento de código no coloque una copia exacta de la entrada en
$line
. Por ejemplo, si hay varios separadores de campo consecutivos, se convertirán en una única instancia del primer elemento. Esto a menudo se reconoce como pérdida de espacios en blanco circundantes. - El tercer fragmento de código hará lo mismo que el segundo, excepto que solo se dividirá en un espacio (no el espacio habitual, la pestaña o la nueva línea).
- El primer fragmento de código colocará la línea completa leída, palabra por palabra, en