我找到了这个。
我正在尝试这个:
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 版本,但适用于所有情况。
如果您想要的只是第一个换行符之前的文本,还有另一种方法:
x='some
thing'
y=${x%$'\n'*}
之后y
将包含some
其他内容(没有换行符)。
这里发生了什么?
我们对第一个ANSI C 换行符( )的最短匹配执行参数扩展子字符串删除( ) 并删除后面的所有内容 ( )。${PARAMETER%PATTERN}
$'\n'
*