我找到了this。
我正在尝试这个:
x='some
thing'
y=(${x//\n/})
我没有运气,我认为它可以使用双反斜杠:
y=(${x//\\n/})
但事实并非如此。
为了测试我没有得到我想要的东西:
echo ${y[1]}
获得:
some
thing
我想成为:
some
我希望y
成为数组[some, thing]
。我怎么能这样做?
答案 0 :(得分:83)
另一种方式:
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
包含匹配的通配模式(例如“*
”),否则此方法将起作用 - 在这种情况下,它将被匹配的文件名替换( S)。 read
/ readarray
方法需要较新的bash版本,但适用于所有情况。
答案 1 :(得分:0)
还有另一种方法,让您只需要第一行换行符之前的文本即可。
x='some
thing'
y=${x%$'\n'*}
此后,y
将包含some
,并且不包含其他内容(无换行)。
这是怎么回事?
我们对最短的匹配执行parameter expansion substring removal(${PARAMETER%PATTERN}
),直到第一个ANSI C line feed($'\n'
)为止,然后删除其后的所有内容(*
)