Как разбить многострочную строку, содержащую символы "\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
Ответы
Ответ 1
По умолчанию встроенный 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
), на самом деле требуется mapfile
в bash v4 или выше:
mapfile -t arr <<< "$string"
Ответ 2
mapfile
более элегантный, но это возможно сделать в одной (уродливой) линии с помощью read
(полезно, если вы используете версию bash старше 4):
IFS=$'\n' read -d '' -r -a arr <<< "$string"