2012-07-31 18 views
13

tengo una cadenaen el siguiente formato:Cómo dividir una cadena de varias líneas que contiene los caracteres " n" en una matriz de cadenas en bash?

I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms 

me gustaría pasar esto a una serie de cadenas de línea a línea tal que:

$ echo "${ARRAY[0]}" 
I'm\nNed\nNederlander 

$ echo "${ARRAY[1]}" 
I'm\nLucky\nDay 

$ echo "${ARRAY[2]}" 
I'm\nDusty\nBottoms 

Sin embargo, estoy encontrando problemas con los caracteres "\ n" dentro de la cadena misma. Están representados en la cadena como dos caracteres separados, la barra invertida y la 'n', pero cuando intento hacer la división de la matriz, se interpretan como líneas nuevas. Por lo tanto, la división típica de cadenas con IFS no funciona.

Por ejemplo:

$ read -a ARRAY <<< "$STRING" 
$ echo "${#ARRAY[@]}" # print number of elements 
2 

$ echo "${ARRAY[0]}" 
I'mnNednNederla 

$ echo "${ARRAY[1]}" 
der 
+0

por cierto, ¿alguien sabe cómo solucionar la sE terrible formateo del código de arriba? –

+0

El "formato terrible" se debe a que los apóstrofos se interpretan como comillas simples (que espera que estén equilibradas). Use las etiquetas "block quote" en lugar de las etiquetas "code". – twalberg

Respuesta

24

Por defecto, la orden interna permite read \ para escapar caracteres. Para desactivar este comportamiento, use la opción -r. No es frecuente que encuentre un caso en el que no desee usar -r.

string="I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms" 

arr=() 
while read -r line; do 
    arr+=("$line") 
done <<< "$string" 

Con el fin de hacer esto en una línea (como si estuviera tratando con read -a), en realidad requiere mapfile en v4 fiesta o superior:

mapfile -t arr <<< "$string" 
+0

Sí para mapfile oneliner :) –

12

mapfile es más elegante, pero es posible hacer esto en una línea (feo) con read (útil si está utilizando una versión de la fiesta mayor de 4):

IFS=$'\n' read -d '' -r -a arr <<< "$string" 
+0

De hecho, y la opción -d parece crucial para que funcione –

+0

Una advertencia que no sabía cuando publiqué esto: el estado de salida no será cero, ya que una cadena aquí nunca terminará con un carácter nulo como 'read -d ''' esperará. – chepner

Cuestiones relacionadas