用换行符分割bash字符串

时间:2013-11-04 16:11:40

标签: string bash shell

我找到了this

我正在尝试这个:

x='some
   thing'

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

我没有运气,我认为它可以使用双反斜杠:

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

但事实并非如此。

为了测试我没有得到我想要的东西:

echo ${y[1]}

获得:

some
thing

我想成为:

some

我希望y成为数组[some, thing]。我怎么能这样做?

2 个答案:

答案 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')为止,然后删除其后的所有内容(*