2012-07-31 10 views
13

aşağıdaki biçimde bir dize vardır:" n" karakterlerini içeren çok satırlı bir dizeyi bash dizesinde bir dizeye bölmek nasıl?

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

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

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

Ancak, ben:

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

Ben öyle ki çizgiyle dizeleri hattının bir diziye bu hareket etmek istiyorum dizenin kendisinde "\ n" karakterleriyle ilgili sorunlara yol açıyor. Dizgede iki ayrı karakter, ters eğik çizgi ve 'n' olarak gösterilirler, ancak dizi bölünmesini yapmaya çalıştığımda, yeni satırlar olarak yorumlanırlar. Böylece IFS ile ayrılan tipik dize çalışmıyor. Örneğin

:

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

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

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

, herkes SE en düzeltmek için nasıl biliyor Yukarıdaki kodun korkunç biçimlendirmesi? –

+0

"Korkunç biçimlendirme", kesme tırnaklarının tek tırnaklar olarak yorumlandığından (bunun dengelenmeyi beklediği) kaynaklanmaktadır. "Kod" etiketleri yerine "blok alıntı" etiketlerini kullanın. – twalberg

cevap

24

Varsayılan olarak, read yerleşik \ karakterlerden kurtulmak için izin verir. Bu davranışı kapatmak için -r seçeneğini kullanın. Genellikle -r'u kullanmak istemediğiniz bir durum bulamazsınız.

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

evet mapfile oneliner için :) –

12

mapfile daha şık, ama mümkündür:

tek hat (eğer read -a ile çalışıyorlardı gibi) bu yapabilmek için
string="I'm\nNed\nNederlander 
I'm\nLucky\nDay 
I'm\nDusty\nBottoms" 

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

, aslında bash v4 içinde mapfile veya üstü gerektirir (Eğer 4 yaşından büyük bash bir sürümünü kullanıyorsanız kullanışlıdır) read ile bir (çirkin) doğrultusunda bunu yapmak için: BTW

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

Gerçekten de, ve -d seçeneği çalışmasını sağlamak için çok önemli görünüyor –

+0

Tek bir uyarı, bunu ne zaman gönderdiğimi bilmiyordum: çıkış durumu sıfır değil, çünkü burada bir dize hiçbir zaman bitmeyecek '-d' gibi bir boş karakter bekleyecektir. – chepner