87

我找到了这个

我正在尝试这个:

x='some
   thing'

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

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

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

但它没有。

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

echo ${y[1]}

得到:

some
thing

我想成为:

some

我想y成为一个数组[some, thing]。我怎样才能做到这一点?

4

2 回答 2

142

另一种方式:

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/方法需要更新的readarraybash 版本,但适用于所有情况。

于 2013-11-04T16:17:04.173 回答
6

如果您想要的只是第一个换行符之前的文本,还有另一种方法:

x='some
thing'

y=${x%$'\n'*}

之后y将包含some其他内容(没有换行符)。

这里发生了什么?

我们对第一个ANSI C 换行符( )的最短匹配执行参数扩展子字符串删除( ) 并删除后面的所有内容 ( )。${PARAMETER%PATTERN}$'\n'*

于 2019-12-04T14:36:46.417 回答