Perder nueva línea después de asignar el resultado grep a una variable de shell

80
#!/usr/local/bin/bash
out=`grep apache README`
echo $out;

Por lo general, grep muestra cada coincidencia en una línea separada cuando se ejecuta en la línea de comando. Sin embargo, en los scripts anteriores, la nueva línea que separa cada coincidencia desaparece. ¿Alguien sabe cómo se puede preservar la nueva línea?


fuente

Respuestas:

105

No te estás perdiendo en la tarea sino en el eco. Puede ver esto claramente si:

echo "${out}"

Verá un efecto similar con el siguiente script:

x="Hello,
I
am
a
string
with
newlines"
echo "====="
echo ${x}
echo "====="
echo "${x}"
echo "====="

que salidas:

=====
Hello, I am a string with newlines
=====
Hello,
I
am
a
string
with
newlines
=====

Y, irrelevante para su pregunta, pero me gustaría mencionarlo de todos modos, prefiero usar la construcción $ () en lugar de las comillas invertidas, solo por el beneficio adicional de poder anidar comandos. Entonces su línea de script se convierte en:

out=$(grep apache README)

Ahora, puede que no se vea diferente (y no lo es) pero hace posibles comandos más complejos como:

lines_with_nine=$(grep $(expr 7 + 2) inputfile)
paxdiablo
fuente
2
No sabía que podías hacer eso con $ () ... aprender algo nuevo todo el tiempo aquí.
Tanj
1
Puedes hacer matemáticas sin usar expr. Solo use doble parens: $ ((7 + 2))
Barry Brown
En realidad, podría intentar eso con todas mis respuestas de ahora en adelante: agregue un fragmento (no siempre totalmente) relevante para la educación del enjambre :-)
paxdiablo
Buen punto, Barry, pero fue solo un ejemplo de anidación: mis habilidades para generar ejemplos parecen haberse deteriorado con la edad (y / o el alcohol :-).
paxdiablo
Yo mismo me acabo de enterar de lo de $ (()).
Barry Brown
34

Ponga $ entre comillas:

#!/usr/local/bin/bash
out=`grep apache README`
echo "$out";
pesto
fuente
20

Citar variables en bash conserva los espacios en blanco.

Por ejemplo:

#!/bin/bash
var1="A B  C   D"
echo $var1   # A B C D
echo "$var1" # A B  C   D

como las nuevas líneas son espacios en blanco, se "eliminan"

Tanj
fuente
2

Combinando otras respuestas en una sola línea:

echo "($(grep apache README))"
paragbaxi
fuente