我找到了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