2012-08-10 26 views

Respuesta

21

en cuenta la variable después de varias líneas

x=$(echo -e "a\nb\nc d e") 

y un proceso simple para cada línea: simplemente echo con un prefijo = LINE: y con comillas simples alrededor de la línea. Cualquiera de los siguientes códigos se cumple este requisito:

while read line; do echo "LINE: '${line}'"; done <<< "$x" 

o

while read line; do echo "LINE: '${line}'"; done < <(echo "$x") 

Ni crea un subnivel (lo que puede, por ejemplo, establecer las variables en el bucle y acceder a ellos fuera de ella), y tanto la producción

LINE: 'a' 
LINE: 'b' 
LINE: 'c d e' 

Pero supongamos que tiene lugar

x=$(echo -e "a \n b\nc d e") 
# note--------^--^ 

y ese espacio en blanco inicial y final para su aplicación (por ejemplo, análisis de porcelana Git). Ambos códigos proporcionarán exactamente el mismo resultado para la última variable/datos que para el anterior, que no es lo que usted desea. Para conservar el espacio en blanco inicial y final, reemplace while read line con while IFS= read -r line. Es decir, cualquiera de los siguientes códigos

while IFS= read -r line; do echo "LINE: '${line}'"; done <<< "$x" 

o

while IFS= read -r line; do echo "LINE: '${line}'"; done < <(echo "$x") 

producirá

LINE: 'a ' 
LINE: ' b' 
LINE: 'c d e' 

Ver Greg Wooledge's excellent Bash FAQ para más detalles.

+0

esta es una solución perfecta, solo curiosidad, ¿por qué no simplemente x = "a \ nb \ nc d e"? –

+0

@SenthilKumar, esa cadena contiene 10 caracteres: 'a', '\', 'n', 'b', etc. Las "\ n" no son especiales entre comillas dobles. En bash, uno podría escribir '$" a \ nb \ nc d e "' para tener nuevas líneas reales incrustadas en la cadena. La bandera "-e" le dice a 'echo' que procese" \ n "como una nueva línea, no como dos caracteres individuales. – chepner

+0

@chepner: thx, '$' era nuevo para mí, pero funciona con comillas simples '$ 'a \ nb \ nc d e'' –

1

Aunque normalmente utilizo "while read" para procesar variables de varias líneas, recientemente tuve una instancia en la que eliminó el espacio inicial de cada línea en un archivo. El uso de este lugar fijo mi problema:

printf %s "$var" | while IFS= read -r line 
do 
    echo "$line" 
done 

Código tomado de this Unix Stack Exchange answer.

Cuestiones relacionadas