2013-11-04 74 views
32

我找到了this用換行符分割bash字符串

,我試圖這樣的:

x='some 
    thing' 

y=(${x//\n/}) 

我沒有運氣,我認爲它可能帶有雙反斜線工作:

y=(${x//\\n/}) 

但事實並非如此。

爲了測試我沒有得到我想要我在做什麼:

echo ${y[1]} 

獲取:

some 
thing 

,我想是:

some 

我想y到是一個數組[some, thing]。我怎樣才能做到這一點?

+2

請注意,一旦你解決了換行問題,'some'將在'$ {y [0]}'中,而不是'$ {y [1]}'。 – chepner

回答

55

另一種方式:

x=$'Some\nstring' 
readarray -t y <<<"$x" 

或者,如果你沒有的bash 4,在bash 3.2等價的:

IFS=$'\n' read -rd '' -a y <<<"$x" 

你也可以做到這一點,你最初嘗試使用方式:

y=(${x//$'\n'/ }) 

但是,如果您的字符串已包含空格,例如'line 1\nline 2'。爲了使它工作,你需要分析它之前限制每個詞的分界:

IFS=$'\n' y=(${x//$'\n'/ }) 

...然後,因爲要更改分隔符,你不需要轉換的\nspace了,所以可以將其簡化爲:

IFS=$'\n' y=($x) 

該方法將起作用除非$x包含匹配通配符圖案(如「*」) - 在這種情況下它將由匹配文件名(多個)所取代。方法read/readarray需要更新的bash版本,但在所有情況下都可以使用。

+1

在擴展模式中將'\ n'的實例與'\\ n'匹配不起作用;相反,你必須在'\ n' *文字*:'echo $ {x // $'\ n'/}'拼接。 – mklement0

+0

@ mklement0:謝謝,編輯。 –

+2

'readarray'方法實際上是*最健壯的*方法,因爲'($ x)'*仍然受制於globbing *:如果任何行碰巧是有效的,*單標記* globbing模式(例如' *'),如果文件匹配,它將被擴展。 'readarray'需要bash * 4 *,但是;這裏是相當於bash 3.2(對於OS X的):'IFS = $'\ n'read -rd''-a y <<<「$ x」'。既然你的帖子正在獲得牽引力,你會介意添加這些發現嗎? – mklement0