Tal vez no sea tan intuitivo y podría decirse oscura como el infierno, pero en el espíritu de integridad, mientras esperamos a que BASH captura en reemplazar en llegar, lo siguiente es posible en la actualidad.
#!/bin/bash
name='joshua'
[[ $name =~ ([ao].*)([oa]) ]] && \
echo ${name/$BASH_REMATCH/X${BASH_REMATCH[1]}X${BASH_REMATCH[2]}}
En ese ejemplo, sabemos lo que estamos buscando. Más cerca de la coincidencia de todas o de las equivalentes globales de expresiones regulares, el siguiente ejemplo encajará codicioso con la última aparición de la colección sin el prefijo X y continúa hacia atrás hasta que no quede ninguno.
#/bin/bash
name='joshua'
while [[ $name =~ .*[^X]([oa]) ]]; do
name=${name/$BASH_REMATCH/${BASH_REMATCH:0:-1}X${BASH_REMATCH[1]}}
done
echo $name
Ese ejemplo funcionará similar a la mirada detrás de la expresión /(?<!X)([oa])/X\1/
que asume que sólo se preocupan por la junta y un personajes que no tienen un X prefijado.
salida para ambos ejemplos
jXoshuXa
nJoy!
No veo nada en mi versión de bash (4.1.5) sobre poder hacer sustituciones de expresiones regulares utilizando la sintaxis '$ {foo/bar/baz}'. ¿Tiene alguna referencia de por qué cree que debería poder hacer eso? –
No estoy seguro de dónde me encontré pero funciona. Utilizando mi ejemplo anterior, puede ver que está reemplazando el 'o' y el' a' con una 'X'. Bastante resbaladizo – joshuapoehls
Ver http://tldp.org/LDP/abs/html/parameter-substitution.html, la descripción de esto es aproximadamente 3/4 del camino hacia abajo de la página. –