Quiero dividir 'hello'
en h e l l o
en una matriz utilizando sólo golpe, que podría hacerlo en sed con sed 's/./& /g'
pero quiero saber cómo dividir una cadena en una matriz en Bash cuando no sé lo que sería el delimitador o el delimitador es cualquier solo personaje No creo que pueda usar ${i// /}
sin un poco de creatividad porque el delimitador es un desconocido, y no creo que esa expresión acepte expresiones regulares. Intenté usar BASH_REMATCH con [[string = ~ ([az].). *]] Pero no funciona como esperaba. ¿Cuál es la forma correcta de usar solo bash para lograr un string.split()
tipo de comportamiento? La razón es que estoy tratando de escribir la utilidad rev en todo bash:
while read data; do
word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
new=()
i=$((${#word[@]} - 1))
while [[ $i -ge 0 ]]; do
new+=(${word[$i]})
(( i-- ))
done
echo ${new[@]}|tr -d ' '|tr '_' ' '
done
Pero usé tr y sed, quiero saber cómo hacer la división correctamente y luego lo arreglaré para que sea todo bash. Solo por diversión.
[[ $string =~ ${string//?/(.)} ]]
estableceráBASH_REMATCH[]
según sea necesario, vea mi respuesta a la pregunta a la que Peter Mortensen se vincula para obtener una explicación.Respuestas:
Salida:
o (tenga en cuenta los comentarios)
Salida:
fuente
while read -N 1 c; do a+=("$c"); done <<< "$s"
. El-N
permite leer incluso los saltos de línea, y las cotizaciones de("$c")
evitar la expansión ruta (y algunas otras cuestiones).while read -N 1 c; do a+=("$c"); done <<< "$s"x
y luego borrar el último salto de línea y el x añadido:unset a[${#a[@]}-1]; unset a[${#a[@]}-1]
.Para dividir la cadena en una matriz de caracteres, con delimitador nulo, puede:
Con un delimitador que no sea nulo, puede:
fuente
IFS
se puede establecer, a continuación, puedes hacer:IFS=',' arr=($str)
.Solo por diversión (y otras conchas) otra variante:
Y comprobar
imprimirá
fuente
Método 1:
Un trazador de líneas:
Código ampliado:
Método 2:
Un trazador de líneas:
Código ampliado:
Gracias a @cuonglm por su sugerencia.
Efectivamente, puede usar
$REPLY
esa es la variable predeterminada donderead
lee la entrada.fuente
$REPLY
lugar dechar
variable.