Las expresiones regulares son un poderoso mecanismo que mediante diferentes criterios nos permiten identificar patrones en cadenas de texto, haciendo más sencillo la manipulación de éstas ya que son el lenguaje y formato natural de las clásicas herramientas que encontramos en ambientes UNIX y sistemas derivados como los son GNU/Linux o BSD.

Los criterios que podemos utilizar son variados como por ejemplo: Líneas de texto que terminen con determinada letra, que contengan una secuencia exacta de caracteres, entre muchas otras posibles combianciones. A manera de ejemplo, en sistemas Debian GNU/Linux y derivados vamos a listar los paquetes disponibles en los repositorios empiecen con la letra a con el uso de expresiones regulares.

apt-cache search "" | grep ^a
  • apt-cache search "" Listamos todos los paquetes en los repositorios.
  • | Pipeline (Tubería) Concateno la salida del primer comando (apt-cache) para que sea la entrada del segundo (grep).
  • grep ^a El metacaracter ^ indica el comienzo de una línea seguido de la letra a.

Metacaracteres

Son caracteres que tienen significado especial cuando se crean expresiones regulares, entre los que encontramos:

  • . Un único caracter.
  • * Ninguno o muchos caracteres.
  • ^ Inicio de línea.
  • $ Fin de línea.
  • \ Le quita el significado que tiene el metacaracter que le sigue.
  • [] Algúno de los caracteres que se encuentra en los corchetes.

Algunos ejemplos:

  • ^lib Líneas que empiecen con los caracteres lib.
  • lib$ Líneas que tengan al final los caracteres lib.
  • .asa Algún caracter seguido de los caracteres asa, servirían: casa, tasa, nasa, uasa, etc.
  • [ct]asa El caracter c o t seguido de los caracteres asa, sólo servirían: casa o tasa.

Clases de caracteres (Character Classes)

Al interior de los corchetes podemos indicar rangos de caracteres, por ejemplo [0-9] el cual sería lo mismo que [0123456789]. Otro ejemplo es [a-z] para indicar alguna letra del alfabeto en minúscula, pero algunos lenguajes tienen sus diferencias, el inglés no cuenta con la ó del idoma español o con la è del francés, para suplir con estas necesidades surge en el estandar POSIX los llamados character classes con los que indicamos de una manera más general conjuntos de caracteres, entre los más importantes están:

  • [:alnum:] Caracteres alfanuméricos
  • [:alpha:] Letras del alfabeto
  • [:digit:] Caracteres numéricos
  • [:lower:] Letras en minúscula
  • [:upper:] Letras en mayúscula

Las clases de caracteres deben ser usadas al interior de los corchetes, es decir que si quiero genrear la expresión regular para el patrón todas las líneas de texto que empiecen con un dígito, sería: ^[[:digit:]]. Sin embargo las expresiones regulares varían entre las diferentes herramientas y sabores UNIX a través de los años, es por esto que el estandar POSIX, encargado de establecer qué debería proveer un sistema basado en UNIX, establece solamente dos tipos de expresiones regulares.

Basic y Extended Regular Expressions (BRE – ERE)

Aunque BRE Y ERE comparten la mayoría de metacaracteres, existen algunas diferencias como por ejemplo el uso de nuevos metacaracteres en ERE (? + | ):

  • ? Una o ninguna instancia del elemento que lo precede.
  • + Una o más instancias del elemento que lo precede.
  • | Una de las dos expresiones que están a lado y lado de este metacaracter.

Ejemplos con sus respectivos resultados posibles:

  • [cp]?asa -> casa, pasa, asa
  • [cp]+asa -> casa, pasa, cpasa, cppasa, etc. No serviría asa. En general se podría todas las combinaciones posibles de los caracteres c y p seguidos de las cadena asa.
  • os[a|o] -> osa, oso

Agrupación ( )

Tenemos que tener en cuenta que podemos agrupar con los paréntesis, pero miremos un ejemplo para su mejor comprensión que pese a su similitud, con la introducción de los paréntesis para agrupar partes de la expresión regular, cambia de manera drástica el resultado:

  • ^abc|xyz$ Una línea que empiece con la cadena abc o que termine con la cadena xyz.
  • ^(abc|xyz)$ Líneas que contengan únicamente abc o xyz.

Expresiones regulares y herramientas UNIX

Aunque las expresiones regulares se usan en la gran mayoría de herramientas UNIX, miremos de manera básica su uso en dos de ellas:

grep

POSIX define que un sistema UNIX debe tener una herramienta grep que funcione con BRE y ERE (además de funcionar como Fast grep). La implementación de grep en Debian GNU/Linux es del Proyecto GNU, la cual por defecto usa expresiones regulares básicas, en caso de querer usar ERE se debe indicar con la opción -E:

$ grep -E "os[a|o]"

Aunque es común encontrar también la herramienta egrep en ambientes UNIX la cual funciona con ERE por defecto, esta no hace parte del estandar POSIX.

tr

Aquí un ejemplo básico de reemplazar texto en mayúscula a minúscula con tr:

$ echo "HOLA MUNDO" | tr "[[:upper:]]" "[[:lower:]]"