viernes, 24 de junio de 2016

Alternancia

La primera característica de las expresiones regulares extendidas que veremos se llama alternancia, que es la función que nos permite que se produzca una coincidencia entre un conjunto de expresiones. Del mismo modo que una expresión entre corchetes permite que un carácter único se encuentre dentro de una serie de caracteres especificados, la alternancia permite coincidencias dentro de una serie de cadenas u otras expresiones regulares.

Para demostrarlo, usaremos grep junto con echo. Primero, probemos una antigua y sencilla coincidencia:

[me@linuxbox ~]$ echo "AAA" | grep AAA
AAA
[me@linuxbox ~]$ echo "BBB" | grep AAA
[me@linuxbox ~]$

Un ejemplo muy sencillo, en el que canalizamos la salida de echo a grep y vemos el resultado. Cuando ocurre una coincidencia, vemos que se imprime; cuando no hay coincidencias, no vemos resultados.

Ahora añadiremos alternancia, indicada por el metacarácter de la barra vertical:

[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ echo "CCC" | grep -E 'AAA|BBB'
[me@linuxbox ~]$

Aquí vemos la expresión regular 'AAA|BBB', que significa "encuentra la cadena AAA o la cadena BBB." Fíjate que como es una característica extendida, añadimos la opción -E a grep (aunque podríamos simplemente usar el programa egrep en su lugar), e incluiremos la expresión regular entre comillas para prevenir que el shell interprete el metacaracter de la barra vertical como el operador de canalizar. La alternancia no está limitada a dos opciones:

[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB|CCC'
AAA

Para combinar la alternancia con otros elementos de expresiones regulares, podemos usar () para separar la alternancia:

[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt

Esta expresión encontrará los nombres de archivo en nuestras listas que empiecen con "bz", "gz" o "zip". Si eliminamos los paréntesis, el significado de esta expresión regular:

[me@linuxbox ~]$ grep -Eh '^bz|gz|zip' dirlist*.txt

cambia y encuentra cualquier nombre de archivo que comience por "bz" o contenga "gz" o "zip".

No hay comentarios:

Publicar un comentario