Разбить строку на массив, используя многосимвольный разделитель - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно разбить строку на массив.Моя проблема в том, что разделитель состоит из 3 символов: _-_Например:

db2-111_-_oracle12cR1RAC_-_mariadb101

Мне нужно создать следующий массив:

db2-111
oracle12cR1RAC
mariadb101

Подобные вопросы следуют этому подходу:

str="db2-111_-_oracle12cR1RAC_-_mariadb101"
arr=(${str//_-_/ })
echo ${arr[@]}

Даже если массивсоздан, он был некорректно разделен:

db2 
111 
oracle12cR1RAC 
mariadb101

Кажется, что символ "-" в первом элементе вызывает сбой функции разбиения массива.Можете ли вы предложить исправить это?Спасибо

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Если можете, замените последовательности _-_ другим одиночным символом, который можно использовать для разделения поля.Например,

$ str="db2-111_-_oracle12cR1RAC_-_mariadb101"
$ str2=${str//_-_/#}
$ IFS="#" read -ra arr <<< "$str2"
$ printf '%s\n' "${arr[@]}"
db2-111
oracle12cR1RAC
mariadb101
0 голосов
/ 15 октября 2018

Использование Perl однострочного

$ echo "db2-111_-_oracle12cR1RAC_-_mariadb101" | perl -F/_-_/ -ne ' { print "$F[0]\n$F[1]\n$F[2]" } '
db2-111
oracle12cR1RAC
mariadb101
0 голосов
/ 10 октября 2018

Вы можете использовать sed, чтобы делать то, что вы хотите, т.е. писать что-то вроде этого:

str="db2-111_-_oracle12cR1RAC_-_mariadb101"
arr=($(sed 's/_-_/ /g' <<< $str))
echo ${arr[0]}

Редактировать:

Причина arr=(${str//_-_/ }) didnдело в том, что когда вы пишете это так, все внутри ${ ... } рассматривается как 1 элемент массива.Таким образом, использование sed или даже просто arr=($(echo ${str//_-_/ })) даст ожидаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...