¿Cómo dividir cadena por separador de cadena (varios caracteres) en una matriz?

¿Cómo dividir cadena por separador de cadena (varios caracteres) en una matriz?

Básicamente, me gustaría dividir una cadena en una matriz mediante un separador de cadenas como, sep.por ejemplo. ¿Existe una bashforma nativa de hacer esto sin utilizar herramientas como sed, awketc.? Sé que puedo dividir una cadena en una matriz configurándola IFSy usándola, read -rapero eso no funciona con separadores de cadenas. Y si no es así ¿cómo lo harías con herramientas como sed, awk, etc?

Digamos que tengo la cadena This is some sep.stringy me gustaría dividirla en una matriz con 2 elementos: This is somey string.

Respuesta1

Podrías iterar manualmente a través de la variable con expansión de parámetros:

#!/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}")

Esto recorre la variable (actualizándola en el proceso), eliminando el primer separador en adelante ( %%busca la coincidencia más larga, por lo que se rastreará hacia atrás desde el final de la cadena hasta la primera instancia de sep.); agrega ese resto a la matriz y luego elimina ese resto y el separador del frente de la variable. Itere hasta que la variable ya no contenga un separador, luego agregue el resto a la matriz.

Respuesta2

Una especie de forma nativa de hacerlo utilizando tanto la expansión de parámetros como la matriz de lectura.

string='This is some sep.string'
mapfile -t array < <( echo "${string//sep./$'\n'}" )

${string//sep./$'\n'}- Reemplazará las apariciones de sep.con una nueva línea. mapfile/ readarraycreará una matriz con cada línea en su propio elemento.

información relacionada