Básicamente, me gustaría dividir una cadena en una matriz mediante un separador de cadenas como, sep.
por ejemplo. ¿Existe una bash
forma nativa de hacer esto sin utilizar herramientas como sed
, awk
etc.? Sé que puedo dividir una cadena en una matriz configurándola IFS
y usándola, read -ra
pero 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.string
y me gustaría dividirla en una matriz con 2 elementos: This is some
y 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
/ readarray
creará una matriz con cada línea en su propio elemento.