Un de las principales ventajas de las expresiones regulares
es poder editar ficheros, sustituir textos o generar nuevos
ficheros manipulando el contenido de otros.
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 sinaxis de sed es limitada.
$ echo "aabbccdd"|sed "s/a/x/"
|
$ echo "aabbccdd"|sed "s/a/x/g"
|
$ echo "aabbccdd"|sed "s/a\+/x/"
|
$ echo "aabbccdd"|sed "s/a*/x/"
|
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.
echo "esto si es asi"|sed "s/\<si\>/no/g"
|
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".
echo "esto si es asi"|sed "s/\<Si\>/no/gi"
|
$ echo "esto si es asi"|sed "s/\<Si\>/no/g"
|
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.
echo "esto si es asi"|sed "s/\(.*es\)\(.*\)/\2 \1 /g"
|
asi esto si es
echo "esto si es asi"|sed "s/\(.*es\)(.*\)/## & ##/g"
|
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"
|
$ echo "esto si es asi"|perl -p -e "s/(.*es)(.*)/\2 \1/g"
|
asi esto si es