2011-09-07 18 views
13

Cuando uso "test.file gato", se mostrará¿Cómo mantener la barra invertida al leer desde un archivo?

printf "This is a test log %d \n, testid"; 
1 
    2 

Cuando utilizo el archivo bash,

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

Se mostrará

printf "This is a test log %d n, testid"; 
1 
    2 

El "\" se ha ido.

¿Hay alguna forma de que pueda mantener el "\" y el espacio al mismo tiempo?

+2

Creo que significa '

+1

bash' información, la búsqueda de la commmand "leer" : "El carácter de barra invertida '\' se puede usar para eliminar cualquier significado especial para la lectura del siguiente carácter y para la continuación de la línea". (Esto no resuelve el problema, pero lo explica). –

Respuesta

24

Intente utilizar read -r.

Desde la página del manual:

-r
Si se da esta opción, la barra invertida no actúa como un carácter de escape. La barra diagonal inversa se considera parte de la línea. En particular, una barra diagonal inversa- par no se puede utilizar como una continuación de línea.

Ejecutar esto para probar que:

read -r a < <(echo "test \n test"); echo $a 
0
data="$(cat < test.file)" 
for line in $data 
do 
echo "$line" 
done 
+2

Más simple: 'data =" $ (cat test.file) "' o 'data =" $ (

+2

No lo hace necesita sorber todo el archivo en '$ data'. 'para la línea en $ (

+0

Aún necesitará jugar con el IFS para evitar que bash los interprete como separadores. – jedwards

0
#!/bin/bash 

# Store the original IFS 
OIFS="$IFS" 
# Update the IFS to only include newline 
IFS=$'\n' 
# Do what you gotta do... 
for line in $(<test.file) ; do 
    echo "$line" 
done 
# Reset IFS 
IFS="$OIFS" 

Más o menos en el que se dirigían a la IFS además la sugerencia de Keith Thompson.

Cuestiones relacionadas