2011-02-17 9 views
6

Una cosa todavía molesto simple:
El uso de un script como el siguiente:cómo frenar golpe de la eliminación de espacios en blanco cuando se procesa el archivo

while read x; do 
    echo "$x" 
done<file 

en un archivo que contiene espacios en blanco:

text 

me dará una salida sin el espacio en blanco:

text 

El problema i s necesito este espacio antes del texto (es una pestaña en su mayoría, pero no siempre).
Entonces la pregunta es: ¿cómo obtener líneas idénticas como están en el archivo de entrada en una secuencia de comandos?


Actualización: Ok, así que cambió mi while read x-while IFS= read x.

echo "$x" me da la respuesta correcta sin pelar la primera pestaña, pero, eval "echo $x" quita esta pestaña.

¿Qué debo hacer entonces?

Respuesta

13

read está eliminando el espacio en blanco. Limpie primero $IFS.

while IFS= read x 
do 
    echo "$x" 
done < file 
+0

Genial, gracias. Pero, por favor, dime, ¿por qué simple lectura elimina los espacios en blanco? Pensé que debería pasar la línea como está. – kasper

+0

De 'help read':" ... los caracteres encontrados en $ IFS se reconocen como delimitadores de palabras. " –

+1

maldito mi ignorancia 'ayuda'. Gracias una vez más – kasper

1

Todo el contenido de la lectura se coloca en una variable llamada REPLY. Si usa REPLY en lugar de 'x', no tendrá que preocuparse por la separación de palabras de lectura y IFS y todo eso.

Me encontré con el mismo problema que está teniendo al intentar quitar espacios del final de los nombres de archivo. RESPUESTA vino al rescate:

find . -name '* ' -depth -print | while read; do mv -v "${REPLY}" "`echo "${REPLY}" | sed -e 's/ *$//'`"; done 
+0

Es sorprendente que "leer" no se comporte como "leer RESPUESTA". –

1

he encontrado la solución al problema 'eval tiras 'echo $ x' esta ficha.' Esto debería solucionarlo:

eval "echo \"$x\"" 

Creo que esto hace que el interior comillas (escapadas) serán evaluados con el eco, mientras que yo creo que tanto

eval "echo $x" 

y

eval echo "$x" 

causa las comillas que se evaluarán antes del eco, lo que significa que la cadena que se pasa al eco no tiene comillas, lo que hace que se pierda el espacio en blanco. Así que la respuesta completa es:

while IFS= read x 
do 
    eval "echo \"$x\"" 
done < file 
Cuestiones relacionadas