我找到了this。用換行符分割bash字符串
,我試圖這樣的:
x='some
thing'
y=(${x//\n/})
我沒有運氣,我認爲它可能帶有雙反斜線工作:
y=(${x//\\n/})
但事實並非如此。
爲了測試我沒有得到我想要我在做什麼:
echo ${y[1]}
獲取:
some
thing
,我想是:
some
我想y
到是一個數組[some, thing]
。我怎樣才能做到這一點?
我找到了this。用換行符分割bash字符串
,我試圖這樣的:
x='some
thing'
y=(${x//\n/})
我沒有運氣,我認爲它可能帶有雙反斜線工作:
y=(${x//\\n/})
但事實並非如此。
爲了測試我沒有得到我想要我在做什麼:
echo ${y[1]}
獲取:
some
thing
,我想是:
some
我想y
到是一個數組[some, thing]
。我怎樣才能做到這一點?
另一種方式:
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'/ })
...然後,因爲要更改分隔符,你不需要轉換的\n
到space
了,所以可以將其簡化爲:
IFS=$'\n' y=($x)
該方法將起作用除非$x
包含匹配通配符圖案(如「*
」) - 在這種情況下它將由匹配文件名(多個)所取代。方法read
/readarray
需要更新的bash版本,但在所有情況下都可以使用。
在擴展模式中將'\ n'的實例與'\\ n'匹配不起作用;相反,你必須在'\ n' *文字*:'echo $ {x // $'\ n'/}'拼接。 – mklement0
@ mklement0:謝謝,編輯。 –
'readarray'方法實際上是*最健壯的*方法,因爲'($ x)'*仍然受制於globbing *:如果任何行碰巧是有效的,*單標記* globbing模式(例如' *'),如果文件匹配,它將被擴展。 'readarray'需要bash * 4 *,但是;這裏是相當於bash 3.2(對於OS X的):'IFS = $'\ n'read -rd''-a y <<<「$ x」'。既然你的帖子正在獲得牽引力,你會介意添加這些發現嗎? – mklement0
請注意,一旦你解決了換行問題,'some'將在'$ {y [0]}'中,而不是'$ {y [1]}'。 – chepner