2011-04-11 15 views
8

¿Cómo puedo incluir la coincidencia de expresiones regulares en la expresión de reemplazo en BASH?Cómo hacer referencia a las capturas en reemplazo de regex bash

inhábiles ejemplo:

#!/bin/bash 
name=joshua 
echo ${name//[oa]/X\1} 

espero a la salida jXoshuXa con \1 de ser reemplazado por el carácter emparejado.

Esto en realidad no funciona y produce jX1shuX1 en su lugar.

+2

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? –

+0

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

+0

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. –

Respuesta

7
bash> name=joshua 
bash> echo $name | sed 's/\([oa]\)/X\1/g' 
jXoshuXa 
+0

Si va a llegar a sed, esto es más simple: 's/[oa]/X &/g' –

+0

¡Gracias! Esperaba poder hacerlo sin llamar a 'sed' pero esto debería funcionar igual de bien. – joshuapoehls

22

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!

Cuestiones relacionadas