21

我有以下格式的字符串:

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”,但是当我尝试进行数组拆分时,它们被解释为换行符。因此,典型的字符串拆分 withIFS不起作用。

例如:

$ read -a ARRAY <<< "$STRING"
$ echo "${#ARRAY[@]}"   # print number of elements
2

$ echo "${ARRAY[0]}"
I'mnNednNederla

$ echo "${ARRAY[1]}"
der
4

2 回答 2

35

默认情况下,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),实际上需要mapfilebash v4 或更高版本:

mapfile -t arr <<< "$string"
于 2012-07-31T17:56:13.967 回答
15

mapfile is more elegant, but it is possible to do this in one (ugly) line with read (useful if you're using a version of bash older than 4):

IFS=$'\n' read -d '' -r -a arr <<< "$string"
于 2012-08-23T02:06:01.843 回答