La asignación no elimina los caracteres de nueva línea, en realidad es el echo
hacer esto. Simplemente necesita poner comillas alrededor de la cadena para mantener esas nuevas líneas:
echo "$testvar"
Esto le dará el resultado que desea. Vea la siguiente transcripción para una demostración:
pax> cat num1.txt ; x=$(cat num1.txt)
line 1
line 2
pax> echo $x ; echo '===' ; echo "$x"
line 1 line 2
===
line 1
line 2
La razón por la que las nuevas líneas se reemplazan con espacios no tiene que ver exclusivamente con el echo
comando, sino que es una combinación de cosas.
Cuando se le da una línea de comando, la bash
divide en palabras de acuerdo con la documentación de la IFS
variable:
IFS: Separador de campo interno que se utiliza para dividir palabras después de la expansión ... el valor predeterminado es <space><tab><newline>
.
Eso especifica que, de forma predeterminada, cualquiera de esos tres caracteres se puede usar para dividir su comando en palabras individuales. Después de eso, los separadores de palabras desaparecen, todo lo que queda es una lista de palabras.
Combine eso con la echo
documentación (un bash
comando interno), y verá por qué se generan los espacios:
echo [-neE] [arg ...]: Muestra los argumentos , separados por espacios, seguidos de una nueva línea.
Cuando lo usa echo "$x"
, obliga a toda la x
variable a ser una sola palabra de acuerdo con bash
, por lo tanto, no se divide. Puedes ver eso con:
pax> function count {
...> echo $#
...> }
pax> count 1 2 3
3
pax> count a b c d
4
pax> count $x
4
pax> count "$x"
1
Aquí, la count
función simplemente imprime el número de argumentos dados. Las variantes 1 2 3
y lo a b c d
muestran en acción.
Luego lo probamos con las dos variaciones de la x
variable. El uno sin citas muestra que hay cuatro palabras, "test"
, "1"
, "test"
y "2"
. Agregar las comillas lo convierte en una sola palabra "test 1\ntest 2"
.
Esto se debe a la variable IFS (Separador de campo interno) que contiene una nueva línea.
Una solución alternativa es restablecer IFS para que no contenga la nueva línea, temporalmente :
Para REVERTIR este cambio horrible para IFS:
fuente
echo "$(IFS=''; cat text.txt)"
Bash -ge 4 tiene el archivo de mapas incorporado para leer líneas de la entrada estándar en una variable de matriz.
Ver también:
http://bash-hackers.org/wiki/doku.php/commands/builtin/mapfile
fuente
Solo si alguien está interesado en otra opción:
fuente
Su variable está configurada correctamente por
testvar=$(cat test.txt)
. Para mostrar esta variable que consta de caracteres de nueva línea, simplemente agregue comillas dobles, p. Ej.Aquí está el ejemplo completo:
fuente
La
envdir
utilidad proporciona una forma sencilla de hacer esto.envdir
usa archivos para representar variables de entorno, con nombres de archivo mapeados a nombres de var env y mapeo de contenido de archivos a valores var env. Si el contenido del archivo contiene nuevas líneas, también lo hará la var env.Ver https://pypi.python.org/pypi/envdir
fuente