Expresiones regulares en Linux (Con video)

¿Qué son expresiones regulares?

Una expresión regular es un patrón que se utiliza para compararlo con un grupo de caracteres.

En Linux las expresiones regulares podemos usarlas con los comandos grep, let, find, diff, date, sed, tr, uniq, sort, join, cut, etc...
Tenemos dos tipos:

  1. Expresiones simples: Son patrones que se ajustan a un único símbolo (en general, a un único carácter), algunos ejemplos:
    1. .  : cualquier carácter.
    2. $ : Fin del texto, se va al final.
    3. ^ : Principio del texto, se va al principio.
  2. Expresiones compuestas: Son patrones que combinan expresiones simples. Se ajustan a una secuencia de símbolos. Algunos ejemplos:
    1. x+ : una o más repeticiones de x.
    2. x* : cero o más repeticiones de x.
    3. x? : cero o una repetición de x.

¿Cómo podemos formar las expresiones regulares?


Aquí tenéis una lista de metacaracteres que usamos en expresiones regulares:

  • . Significa cualquier caracter.
  • ^Indica el principio de una línea.
  • $ Indica el final de una línea.
  • * Indica cero o más repeticiones del caracter anterior.
  • + Indica una o más repeticiones del caracter anterior.
  • \< Indica el comienzo de una palabra.
  • \> Indica el final de una palabra.
  • \ Caracter de escape. Da significado literal a un metacaracter.
  • [ ] Uno cualquiera de los caracteres entre los corchetes. Ej: [A-Z] (desde A hasta Z).
  • [^ ] Cualquier caracter distinto de los que figuran entre corchetes: Ej: [^A-Z].
  • { } Nos permiten indicar el número de repeticiones del patrón anterior que deben darse.
  • | Nos permite indicar caracteres alternativos: Ej: (^|[?&])
  • ( ) Nos permiten agrupar patrones. Ej: ([0-9A-F]+:)+

Además podemos formar expresiones regulares según las clases de caracteres que tengamos:


[:alnum:]Coincide con caracteres alfanuméricos (letras o cifras).
[:alpha:]Coincide con caracteres alfanuméricos (letras).
[:digit:]Coincide con cifras. También se puede usar \d.
[:graph:]Coincide únicamente con caracteres visibles, es decir, con cualquier carácter excepto con espacios, caracteres de control, etc.
[:punct:]Coincide con caracteres de puntuación y con símbolos.
[:print:]Coincide con caracteres visibles y con espacios.
[:space:]Coincide con todos los caracteres de espacio en blanco, incluidos los espacios, las tabulaciones y los saltos de línea. También se puede usar \s
[:word:]Coincide con cualquier carácter de una palabra, es decir, con cualquier letra, cifra o con un guión bajo. También se puede usar \w.



Ejemplos de uso.

Teniendo en cuenta los metacaracteres que se usan en las expresiones regulares podemos usar expresiones regulares sencillas del siguiente modo:
  1. Con comando grep.

Creo un archivo de texto en el en el que introduzco nombres con diferente longitud:





Entonces voy a usar por ejemplo el cat para que me muestre el contenido del fichero en el terminal y con grep y las expresiones regulares haremos un filtro para que nos muestre lo que en realidad necesitamos.


Lo primero que haré será mostrar las líneas con al menos 3 letras. Para ello tendremos que hacer uso de:


  • ^  Indica el principio de línea.
  • .   Representa un carácter

Por tanto usaremos el siguiente comando:

cat <fichero> |grep '^...'





Para que solo nos muestre las líneas con 3 letras basta con añadirle a la expresión regular el carácter "$" detrás de los 3 puntos para decirle que ese es el final de línea:







Estos son ejemplos muy sencillos y que se le puede dar un uso muy frecuente. 

Veamos otro ejemplo haciendo uso de esto. Suponemos que tenemos una lista de correos electrónicos en un fichero de texto. Esta vez me voy a ahorrar el comando cat y los sacaré directamente con grep:


Queremos saber solamente los correos electrónicos que contienen números. Entonces vamos a usar [:digit:] que nos dirá las líneas que contienen números:



USOS DEL COMANDO SED.

Todo esto son ejemplos sencillos haciendo uso del comando grep, pero en Linux las expresiones regulares también funcionan por ejemplo con el comando sed. Este nos permite, de una forma cómoda, borrar líneas, registros o sustituir cadenas de caracteres dentro de las líneas.

Vamos a comenzar usando el fichero de correos electrónicos. El objetivo de este primer ejemplo es el de sustituir un correo por una cadena de caracteres que queramos. Lo primero que haré será mostrar todos los correos que contiene el fichero:


Lo que haremos será sustituir el primer correo por la palabra "prueba" para que veamos con claridad el uso de este comando con expresiones regulares. La sintaxis sería la siguiente:

sed 's/cadena1/cadena2' <fichero> 


Vemos claramente como el primer correo ha sido sustituido por la palabra "prueba" que le hemos indicado. 

Por último voy a mostrar un ejemplo para cambiar de lugar una palabra de un fichero con el comando sed + expresiones regulares que quizás pueda parecer un poco más complejo.

Tenemos un fichero con la frase simple "esto si es así". El objetivo es sustituir la palabra "así" y que nos quede "así esto si es". Este es el fichero:


Ya sabemos que la estructura que usamos para sustituir con sed es s/<cadena1>/<cadena2>, esta vez le voy a añadir al final "/g" que sirve para sustituir todas las cadenas del texto que sean idénticas a la que nosotros le pasamos y que no solo sustituya la primera. Por tanto sería en este caso así:

s/<cadena1>/<cadena2>/g

La <cadena1> la forman 2 sub expresiones regulares:
  1. .*es\  indica que queremos coger la parte del texto hasta la palabra es ("esto si es").
  2. .*\     indica que queremos coger el resto del texto ("así").
Así pues la <cadena1> ya la tendremos montada:

s/ \(.*es\)\(.*\) / <cadena2> /g

Cada subexpresión se pone entre paréntesis porque cada una es independiente de la otra. Cada paréntesis tiene asignado un número según el orden. La primera expresión es el 1 y la segunda el 2. 
Entonces en la segunda cadena le indicaremos un cambio de orden. Sería algo así:
\2 \1 


Por tanto ya estaría acabada la expresión regular:

s/ \(.*es\)\(.*\) / \2 \1 /g

Si la probamos veremos el resultado:



ScreenCast con ejemplos.

He hecho un ScreenCast explicando algunos ejemplos sencillos para entender mejor las expresiones regulares:


Fuentes:




Comentarios

Entradas populares de este blog

Comando TOP y HTOP

Inittab y Upstart.

Copias incrementales con Rsync. Linux a Windows (Parte 1).