Basicamente, eu gostaria de dividir uma string em um array por um separador de strings, como sep.
por exemplo. Existe uma bash
maneira nativa de fazer isso sem usar ferramentas como sed
, awk
etc? Eu sei que posso dividir uma string em um array definindo IFS
e 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
,, awk
etc?
Digamos que eu tenha a string This is some sep.string
e gostaria de dividi-la em um array com 2 elementos: This is some
e 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
/ readarray
criará um array com cada linha em seu próprio elemento.