2012-01-07 33 views
7

Estoy tratando de convertir la salida de un comando como echo -e "a b\nc\nd e" en una matriz.¿Cómo convertir la salida del comando a una matriz línea por línea en bash?

X=($(echo -e "a b\nc\nd e")) 

Divide la entrada para cada nueva línea y el carácter de espacio en blanco:

$ echo ${#X[@]} 
> 5 

for i in ${X[@]} ; do echo $i ; done 
a 
b 
c 
d 
e 

El resultado debe ser:

for i in ${X[@]} ; do echo $i ; done 
a b 
c 
d e 
+0

posible duplicado de [¿Cómo se crea una matriz en la fiesta de una magnitud de guía?] (Http://stackoverflow.com/questions/8750848/how-do-i-create-an-array-in -bash-from-a-command-variable) – Cascabel

+0

Alguien podría encontrar un duplicado mejor; esa es solo la más reciente. Esta pregunta probablemente se haya formulado docenas de veces. – Cascabel

Respuesta

13

Usted necesita cambiar su campo interno Separador variable (IFS) a una nueva línea primero.

$ IFS=$'\n'; arr=($(echo -e "a b\nc\nd e")); for i in ${arr[@]} ; do echo $i ; done 
a b 
c 
d e 
+0

Gracias por las explicaciones. Me pregunto por qué usas 'echo -e' y no solo' echo'. ¿Cualquier razón? – phs

+0

la bandera '-e' le dice a echo que interprete los caracteres de escape de la barra invertida, como' \ n' para generar una nueva línea frente a un literal '\ n' – SiegeX

0

Establecer la IFS a newline. Por defecto, es space.

[jaypal:~] while IFS=$'\n' read -a arry; do 
echo ${arry[0]}; 
done < <(echo -e "a b\nc\nd e") 
a b 
c 
d e 
+5

No, de forma predeterminada es' $ '\ t \ n'', espacios de pestañas y saltos – Cascabel

Cuestiones relacionadas