如何在bash中将包含"\n"字符的多行字符串分割成字符串数组?

28 浏览
0 Comments

如何在bash中将包含"\n"字符的多行字符串分割成字符串数组?

这个问题已经有了答案

如何在Bash中按分隔符拆分字符串?

我有一个字符串的格式如下:

I'm\nNed\nNederlander
I'm\nLucky\nDay
I'm\nDusty\nBottoms

我希望将其按行移动到字符串数组中,使它变成:

$ echo "${ARRAY[0]}"
I'm\nNed\nNederlander
$ echo "${ARRAY[1]}"
I'm\nLucky\nDay
$ echo "${ARRAY[2]}"
I'm\nDusty\nBottoms

但是,我在字符串本身的\"\\n\"字符上遇到了问题。它们在字符串中表示为两个单独的字符,反斜杠和\'n\',但当我尝试进行数组拆分时,它们被解释为换行符。因此,使用 IFS 进行典型的字符串拆分无法工作。

例如:

$ read -a ARRAY <<< "$STRING"
$ echo "${#ARRAY[@]}"   # print number of elements
2
$ echo "${ARRAY[0]}"
I'mnNednNederla
$ echo "${ARRAY[1]}"
der

admin 更改状态以发布 2023年5月19日
0
0 Comments

mapfile 更优雅,但是如果你使用的是比4更老的版本的 Bash,也可以用一行很丑的代码用read完成这个操作:

IFS=$'\n' read -d '' -r -a arr <<< "$string"

0
0 Comments

默认情况下,read 命令允许使用 \ 来转义字符。如果要关闭此行为,请使用 -r 选项。你很少会遇到不想使用 -r 的情况。

string="I'm\nNed\nNederlander
I'm\nLucky\nDay
I'm\nDusty\nBottoms"
arr=()
while read -r line; do
   arr+=("$line")
done <<< "$string"

为了在一行中实现这一点(就像你使用 read -a 一样),实际上需要在 bash v4 或更高版本中使用 mapfile 命令:

mapfile -t arr <<< "$string"

0