2012-07-31 87 views
13

我有一個的格式如下:如何將包含字符「 n」的多行字符串拆分爲bash中的字符串數組?

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

我謹行此移動到絃線的排列使得:

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

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

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

不過,我遇到字符串本身中「\ n」字符的問題。它們在字符串中表示爲兩個單獨的字符,即反斜槓和'n',但是當我嘗試執行數組拆分時,它們會被解釋爲換行符。因此IFS的典型字符串分割不起作用。

例如:

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

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

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

BTW,沒有任何人知道如何解決SE的上面的代碼可怕的格式? – 2012-07-31 17:51:34

+0

「可怕的格式」是由於撇號被解釋爲單引號(它預計會被平衡)。使用「塊引用」標籤而不是「代碼」標籤。 – twalberg 2012-07-31 17:59:53

回答

24

默認情況下,read內置允許\逃脫字符。要關閉此行爲,請使用-r選項。通常情況下,您會發現不想使用-r的情況。

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

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

爲了在一個線(就像你用read -a試圖)要做到這一點,實際上需要在bash V4 mapfile或更高:

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

是的mapfile oneliner :) – 2017-05-12 20:22:46

12

mapfile更優雅,但它是可能的(如果您使用的是bash的版本比舊的4有用)與read做到這一點的一個(醜陋的)線:

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

確實,和-d選項似乎是至關重要的使它工作 – 2016-04-27 12:22:44

+0

一個告誡我不知道什麼時候我發佈:退出狀態將是非零,因爲這裏的字符串永遠不會結束像'read -d'''這樣的空字符將會期待。 – chepner 2016-07-25 13:44:07