Como dividir o separador string por string (multicaracteres) em uma matriz?

Como dividir o separador string por string (multicaracteres) em uma matriz?

Basicamente, eu gostaria de dividir uma string em um array por um separador de strings, como sep.por exemplo. Existe uma bashmaneira nativa de fazer isso sem usar ferramentas como sed, awketc? Eu sei que posso dividir uma string em um array definindo IFSe usando read -ra, mas isso não funciona com separadores de strings. E se não houver, como você faria isso com ferramentas como sed,, awketc?

Digamos que eu tenha a string This is some sep.stringe gostaria de dividi-la em um array com 2 elementos: This is somee string.

Responder1

Você pode iterar manualmente pela variável com expansão 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}")

Isso faz um loop sobre a variável (atualizando-a no processo), removendo o primeiro separador em diante ( %%procura a correspondência mais longa, portanto, isso rastreará de trás para frente, do final da string até a primeira instância de sep.); ele adiciona esse restante à matriz e, em seguida, retira esse restante e o separador da frente da variável. Itere até que a variável não contenha mais um separador e adicione qualquer restante ao array.

Responder2

Uma espécie de maneira nativa de fazer isso usando expansão de parâmetros e readarray

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

${string//sep./$'\n'}- Substituirá as ocorrências de sep.por uma nova linha. mapfile/ readarraycriará um array com cada linha em seu próprio elemento.

informação relacionada