2013-11-04 73 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