Usa bash para leer línea por línea y mantener el espacio

Cuando uso “cat test.file”, se mostrará

1 2 3 4 

Cuando uso el archivo bash,

 cat test.file | while read data do echo "$data" done 

Mostrará

 1 2 3 4 

¿Cómo podría hacer el resultado igual que el archivo de prueba original?

 IFS='' cat test.file | while read data do echo "$data" done 

Me doy cuenta de que podría haber simplificado el ejemplo de algo que realmente necesitaba una tubería, pero antes de que alguien más lo diga:

 IFS='' while read data; do echo "$data" done < test.file 

En realidad, si no proporciona un argumento para la llamada de “lectura”, leer establecerá una variable predeterminada llamada $ REPLY que conservará el espacio en blanco. Entonces puedes hacer esto:

 $ cat test.file | while read; do echo "$REPLY"; done 

Solo para complementar la respuesta de DigitalRoss. Para el caso en que desee alterar el IFS solo para este comando, puede usar llaves. Si lo hace, el valor de IFS cambiará solo dentro del bloque. Me gusta esto:

 echo ' word1 word2' | { IFS='' ; while read line ; do echo "$line" check ; done ; } 

La salida será (manteniendo espacios):

  word1 check word2 check 

read data dividirán los datos por IFS , que típicamente es “\ t \ n”. Esto preservará los espacios en blanco para usted:

 var=$(cat test.file) echo "$var" 

Alternativamente, use una buena herramienta de análisis de archivos, como awk

 awk '{ # do your stuff print }' file