Подтвердить что ты не робот

Как разбить многострочную строку, содержащую символы "\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
4b9b3361

Ответ 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"