Los usos no triviales de expresiones regulares para sustuir patrones suelen indicar la necesidad de mantener una parte del patrón tras la sustitución. Los siguientes ejemplos con sed muestran el uso básico de "variables" en expresiones regulares.

sed stream editor for filtering and transforming text y grep global regular expression print son herramientas muy usadas ya que se puede acceder a gran parte de su potencial de forma muy sencilla. La mayor parte de los casos con los que nos encontramos implican transformaciones triviales pero a veces, como en los siguientes ejemplos, las transformaciones pueden ser algo más complejas.

Cómo referirse al patrón a encontrar

Para referirse a este patrón se usa la variable &. El siguiente ejemplo añade "el" a cada número:

$ echo "Es esta la calle 34 o la 35?" | sed 's/\([0-9][0-9]*\)/numero &/g'
Es esta la calle numero 34 o la numero 35?

"[0-9][0-9]*" filtra cualquier número de al menos un dígito y "\<>" aplica a palabras completas. Por ejemplo: "l3a" no hubiera sido filtrada por el patrón.

Mantener parte del patrón

El siguiente ejemplo encuentra palabras rodeadas por el mismo número (ab está rodeada por 1 y ef por 82) y elimina dicho número:

$ echo "4 9 1 ab 1 cd 13 82 ef 82" | sed 's/\([0-9]*\) \([a-z]*\) \1/\2 /g'
4 9 ab cd 13 ef

Observa que "\1" está en la parte del patrón y se refiere a la expresión "([0-9]*)". "\2" está situado en el script de sustitución y se refiere a "([a-z]*)".

Reemplazar una ocurrencia concreta

De forma parecida, uno podría querer reemplazar sólo una de las apariciones de los patrones filtrados. En ese caso, el índice de dicha ocurrencia puede colocarse en el tercer bloque de la expresión sed. El objetivo del siguiente ejemplo es eliminar la primera palabra de una frase:

$ echo "En un lugar de la Mancha" | sed 's/\([a-zA-Z]*\)//1'
 un lugar de la Mancha

En este ejemplo "[a-zA-Z]" filtra cualquier palabra con letras mayúsculas o minúsculas.

Una última nota acerca de sed

El delimitador más conocido de sed es el caracter de la barra / pero observa que, según el manual, el delimitador es aquel que se indique justo después del comando.

Puedes usar la barra siempre ya que se pueden escapar caracteres tal y como se muestra en el siguiente ejemplo:

$ echo "////Texto / libre de barras //" | sed 's/\///g' 
Texto  libre de barras

Pero, si conoces la naturaleza del texto, es más sencillo usar un delimitador distinto:

$ echo "////Texto / libre de barras //" | sed 's:/::g'
Texto  libre de barras
Almacenado en: lenguajes, herramientas

comentarios

No hay ningún comentario.