В принципе, я хотел бы разбить строку на массив с помощью разделителя строк, например sep.
. Есть ли собственный bash
способ сделать это без использования таких инструментов, как sed
, awk
и т. д.? Я знаю, что могу разбить строку на массив, установив IFS
и используя read -ra
, но это не работает с разделителями строк. И если нет, как бы вы сделали это с помощью таких инструментов, как sed
, awk
и т. д.?
Допустим, у меня есть строка This is some sep.string
, и я хочу разбить ее на массив с двумя элементами: This is some
и string
.
решение1
Вы можете вручную выполнить итерацию по переменной с расширением параметров:
#!/bin/bash
var='This is some sep.string
with
newlines
sep.another line'
a=()
while [[ $var =~ sep\. ]]
do
e=${var%%sep.*}
a+=("${e}")
var=${var#${e}sep.}
done
a+=("${var}")
Это цикл по переменной (обновляя ее в процессе), удаляя первый разделитель вперед ( %%
ищет самое длинное совпадение, поэтому это будет отслеживаться в обратном направлении от конца строки до первого экземпляра sep.
); он добавляет этот остаток в массив, затем удаляет этот остаток и разделитель из начала переменной. Повторяйте до тех пор, пока переменная не будет содержать больше разделителя, затем добавьте любой остаток в массив.
решение2
Что-то вроде нативного способа сделать это, используя как расширение параметров, так и readarray.
string='This is some sep.string'
mapfile -t array < <( echo "${string//sep./$'\n'}" )
${string//sep./$'\n'}
- Заменит вхождения на sep.
новую строку.
mapfile
/ readarray
создаст массив, в котором каждая строка будет находиться в отдельном элементе.