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

Разделить bash строку символами новой строки

Я нашел этот.

И я пробую это:

x='some
   thing'

y=(${x//\n/})

И мне не повезло, я думал, что это может работать с двойной обратной косой чертой:

y=(${x//\\n/})

Но это не так.

Чтобы проверить, что я не получаю то, что хочу, я делаю:

echo ${y[1]}

Получение:

some
thing

Кого я хочу быть:

some

Я хочу, чтобы y был массивом [some, thing]. Как я могу это сделать?

4b9b3361

Ответ 1

Другой способ:

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, но работают во всех случаях.