Как разбить строку по разделителю строк (многосимвольному) в массив?

Как разбить строку по разделителю строк (многосимвольному) в массив?

В принципе, я хотел бы разбить строку на массив с помощью разделителя строк, например 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создаст массив, в котором каждая строка будет находиться в отдельном элементе.

Связанный контент