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?

shell 


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)

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";

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"


2

Combinando otras respuestas en una sola línea:

echo "($(grep apache README))"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.