Разделение строки на массив в bash с длинным разделителем - PullRequest
3 голосов
/ 22 января 2020

Используя bash в Терминале на OSX, этот код:

newtext="FIRST<br><br>SECOND<br><br>THIRD" IFS='<br><br>' read -ra text_array <<< "$newtext" printf "%s\n" "${text_array[@]}"

выходы:

FIRST







ВТОРОЕ







ТРЕТЬЕ>

Почему в массиве так много элементов новой строки? Если я использую разделители с одним символом, это работает.

1 Ответ

5 голосов
/ 22 января 2020

IFS может разбивать строку только на каждый отдельный символ, и когда вы предоставляете <br><br>, он разделяет ввод на <, b, r и >.

You можете использовать этот обходной путь, чтобы выполнить свою работу:

s="FIRST<br><br>SECOND<br><br>THIRD"
del=$'\5'   # our arbitrary delimiter; can be any other control character
IFS="$del" read -ra arr <<< "${s//<br><br>/$del}"
declare -p arr

declare -a arr='([0]="FIRST" [1]="SECOND" [2]="THIRD")'
  • del=$'\5' устанавливает разделитель на управляющий символ \5. \5 - это просто произвольный символ, и его можно заменить любым другим символом, которого нет на входе.
  • "${s//<br><br>/$del}" заменить <br><br> контрольным символом \5
  • IFS="$del" разбивает ввод на \5 при заполнении массива
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...