Editar ficheros con expresiones regulares

Un de las principales ventajas de las expresiones regulares es poder editar ficheros, sustituir textos o generar nuevos ficheros manipulando el contenido de otros.


sed

Con sed podemos ejecutar:

       sed "s/expresión_regular/sustitución/gi" fichero

/g indica edición global y afecta a todas las apariciones del texto correspondiente a la expresión regular en el fichero. Si omitimos /g la sustitución sólo afecta a la primera aparición de cada línea. La opción /i evita la distinción entre mayúsculas y minúsculas.

La sintaxis de sed es limitada.


$ echo "aabbccdd"|sed "s/a/x/"
xabbccdd
$ echo "aabbccdd"|sed "s/a/x/g"
xxbbccdd
$ echo "aabbccdd"|sed "s/a\+/x/"
xbbccdd
$ echo "aabbccdd"|sed "s/a*/x/"
xbbccdd

En el primer ejemplo observamos como sólo sustituye la primera "a" por la "x". En el segundo sí ha sustituido todas las apariciones de "a" al haber añadido la opción /g.

En el tercer ejemplo se sustituye una o más apariciones de "a" por "x".

En el último obsevamos el resultado esperado, sustituir una secuencia de "a" por una x.


Palabras

echo "esto si es asi"|sed "s/\<si\>/no/g"
esto no es asi

En el anterior ejemplo vemos como sustituir una palabra por otra en un texto sin que afecte a las demás. Hemos sustituido la palabra "si" por "no" sin que afecte a la palabra "asi".


Mayúsculas

echo "esto si es asi"|sed "s/\<Si\>/no/gi"
esto no es asi
$ echo "esto si es asi"|sed "s/\<Si\>/no/g"
esto si es asi

Vemos como al añadir la opción /i no se distinguen mayúsculas de minúsculas mientras que si la omitimos hacemos distinción.


Referencias

echo "esto si es asi"|sed "s/\(.*es\)\(.*\)/\2 \1 /g"
 asi esto si es
echo "esto si es asi"|sed "s/\(.*es\)(.*\)/## & ##/g"
## esto si es asi ##

Los dos ejemplos anteriores utilizan parte o todo el valor buscado en la propia sustitución. Cada paréntesis especifica una subexpresión regular que posteriormente podremos usar en la sustitución llamándola como \1, \2,... según el orden de los paréntesis. Entonces la parte de (.*es) corresponde con \1 y (.*) corresponde con \2. Es decir, hemos cambiado de posición un texto. En el segundo ejemplo vemos comoel carácter "&" se utiliza en la sustitución con el valor de toda la línea.

Ejemplo:

Con Perl y expresiones regulares podemos

$ echo "esto si es asi"|perl -p -e  "s/(.*?es)(.*)/\2 \1/g"
to si es asi es
$ echo "esto si es asi"|perl -p -e  "s/(.*es)(.*)/\2 \1/g"

asi esto si es