Expresiones regulares extendidas
Los sistemas UNIX actuales admiten extensiones a las expresiones regulares básicas:- debemos usar egrep, grep -E, sed -r
ER | concuerda con |
+ | una o más ocurrencias de la RE anterior |
? | cero o una ocurrencia de la RE anterior |
- Ejemplos:
- ab+c concuerda con abc, abbc, pero no con ac
- ab?c concuerda con ac, abc, pero no con abbc
- Para usar los caracteres (, ), { o } escaparlos con \
Alternancia
El carácter | permite alternar entre 2 o más RE- (a|b)c concuerda con ac o bc
Etiquetado
Las RE que se ponen entre ( ) quedan etiquetadas, y podemos hacer referencia a esos elementos mediante \n, con n el número de la etiqueta- Ejemplos:
- (.)oo\1 concuerda con moom, noon, pero no con moon
- (.)oo\1-(.)aa\1\2 concuerda con moom-paamp
Otros caracteres
Además de los ya vistos, pueden usarse otros metacaracteres:ER | concuerda con |
\n, \r, \t | LF, CR y tab (no siempre funcionan) |
[:space:] | caracteres en blanco ([ \t\n\r\f\v]) |
[:blank:] | espacio y tabulado |
[:alnum:] o \w | caracteres alfánuméricos (letras y números) |
[:digit:] | dígitos |
[:alpha:] | alfabéticos |
[:upper:] | mayúsculas |
[:lower:] | minúsculas |
[:xdigit:] | dígitos hexadecimales |
[:punct:] | signos de puntuación |
[:cntrl:] | caracteres de control |
[:graph:] | caracteres imprimibles (sin espacio) |
[:print:] | caracteres imprimibles (con espacio) |
\<, \> | inicio/fin de palabra |
\b | posición entre palabras |
\B | posición en medio de una palabra |
- [[:upper:]]bc concuerda con Abc, pero no abc
- \babc\b concuerda con ab abc df, pero no con abcdef
- \Babc\B concuerda con ababcdf, pero no con ab abc df
Más ejemplos
- \w+@\w+\.\w+((\.\w+)*)? concuerda con direcciones de e-mail
- (0[1-9]|[12][0-9]|3[01])-(0[1-9]|1[012])-(19|20)[0-9]{2} concuerda con fechas en el formato dd-mm-yyyy (años entre el 1900 y 2099)
- [-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)? concuerda con números en punto flotante (con o sin exponente)
Ejemplos de uso con sed:
$ echo "abc1234def" | sed -r "s/[0-9]+/NUMERO/"
abcNUMEROdef
$ echo "abc1234def" | sed -r ´s/[0-9]+/<&>/´
abc<1234>def
# En el siguiente ejemplo, notar que las ER intentan siempre reconocer la secuencia más larga posible
$ echo "000x111x222x333" | sed ´s/x.*x/<&>/´
000333
# Eliminar blancos a principio y al final de línea y sustituir más de un blanco seguido por uno solo
$ sed -r "s/^_+// ; s/_+$// ; s/__+/_/g" fich
# Pon los 4 primeros caracteres de cada línea al final de la misma
$ sed -r ´s/^(.{4,4})(.*)/\2\1/´ fich
# Cambia de minúsculas a mayúsculas la primera letra de cada palabra
$ sed -r ´s/\<./\u&/g´
# Convierte DOS newlines (CR/LF) a formato Unix (LF)
$ sed ´s/^M$//´4
# también funcionaría
$ sed ´s/\r//´