Tengo una variable de script que es multilínea. ¿Cómo atravieso esta variable para leerla línea por línea y procesar cada línea como quiero?Leer línea por línea desde una variable en el shell scripting
Respuesta
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.
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.
- 1. ¿Cómo leer desde un child_process línea por línea en Node.js?
- 2. Leer cadena línea por línea
- 3. Perl leer línea por línea
- 4. Cómo leer línea por línea desde un área de texto
- 5. ¿Cómo leer desde la entrada estándar línea por línea?
- 6. R - Leer STDIN línea por línea
- 7. ¿Cómo leer una línea desde la consola en C?
- 8. Leer una cadena línea por línea usando C++
- 9. ¿Cómo leer línea por línea en archivo pdf usando PyPdf?
- 10. ¿Cómo leo una línea FIFO/nombrada línea por línea desde una aplicación C++/Qt Linux?
- 11. phantomjs javascript leer un archivo local línea por línea
- 12. Leer/Analizar archivo de texto línea por línea en VBA
- 13. ¿Cómo leer exactamente una línea?
- 14. Cómo leer archivos CSV línea por línea en VBScript
- 15. ¿Cómo leer datos línea por línea desde un archivo usando el script ant?
- 16. Leer línea por línea en escritura del golpe
- 17. Leer un archivo de texto línea por línea en Qt
- 18. ¿Cómo leer un archivo .gz línea por línea en C++?
- 19. Leer un archivo línea por línea en Prolog
- 20. Shell Scripting: uso de una variable para definir una ruta
- 21. Shell - consulta de una línea
- 22. Shell Script, leer en la misma línea tras hacerse eco de un mensaje
- 23. Rendimiento al leer un archivo línea por línea vs leer todo el archivo
- 24. Leer dos archivos de texto línea por línea simultáneamente -python
- 25. sincronización nodejs leer archivo grande línea por línea?
- 26. ¿Cómo se procesa la salida de un comando en el shell línea por línea?
- 27. C++ Leer archivo línea por línea y luego dividir cada línea usando el delimitador
- 28. SPRINTF en shell scripting?
- 29. leer una línea usando fscanf()
- 30. Aplicar parche línea por línea
esta es una solución perfecta, solo curiosidad, ¿por qué no simplemente x = "a \ nb \ nc d e"? –
@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
@chepner: thx, '$' era nuevo para mí, pero funciona con comillas simples '$ 'a \ nb \ nc d e'' –