Expresiones Regulares para Administradores

De WikiSalud
Saltar a: navegación, buscar

Contenido

Introducción

Muchos comandos en la consola de Debian nos permiten usar expresiones regulares en nuestro diario trabajo. Si bien es posible que no sea sencillo de aprender para muchos, el uso constante de expresiones regulares puede volverse adictivo a la hora de filtrar, seleccionar y analizar grandes vólumenes de información

¿De que va todo esto?

Las expresiones regulares pueden definirse como una cadena de texto que describe a otra. Otra forma de verlo es como el resumen de una cadena en otra. Un ejemplo podría hacer visible el concepto:

(Abusaremos de la simbología: Tomaremos '=>' por equivalente)

'Texto' => '\w*'

Es decir: La cadena compuesta por '\w*' describe perfectamente a la cadena 'Texto'. El carácter '.' también es capaz de describir, en conjunto con el cuantificador '*', aunque la forma en que lo describe es ligeramente diferente. Y así, dos conceptos están siendo introducidos. Y podemos repasar dar lista a nuestra primera tabla

Carácter Funcionalidad
. Representa cualquier carácter
\d Representa un dígito del 0 al 9.
\w Representa cualquier carácter alfanumérico.

Antes de avanzar, debe quedar claro desde el principio que las wilcard que usa en consola no son expresiones regulares. Usted usa un cuantificador como '*' en el sentido que usaría '.*'. Lo que usa bash es algo totalmente distinto llamado globbing bash, quizá uno de esos conceptos que cuando los mencione entre gente de su mismo gremio le hará parecer inteligente, incluso si ni siquiera se tomó el tiempo de revisar el enlace :)

Aprendiendo a describir una cadena

Como habrá visto, usar expresiones regulares significa reemplazar el expresiones con expresiones de caracteres especiales más simples. Por tanto, nuestra tabla de caracteres necesita ser ampliada.

Carácter Funcionalidad
. Representa cualquier carácter
\d Representa un dígito del 0 al 9.
\w Representa cualquier carácter alfanumérico.
\s Representa un espacio en blanco.
\t Tabulador. Recuerde que en ocasiones se usan espacios para tabular, con lo que no haría coincidencia
\n Retorno de línea. En sistemas Unix

Cuantificadores

Carácter Funcionalidad
{n} Evalua que la coincidencia exista al menos n número de veces
{n,m} Evalua que la coincidencia exista desde al menos n número de veces hasta m número de veces
* Evalúa que la coincidencia exista desde cero a infinitas veces, es decir, es opcional
+ Evalúa que la coincidencia exista al menos una vez hasta infinitas veces.

El poderoso '()'. '[]' y sus logros. |, que nunca sobra

El agrupador () crear una especie de subcadena que ha de evaluarse. Su utilidad más común es la de cuantificar una expresión ya definida: Por ejemplo, con el caso de un nombre:

Fátima Velis Guardado => (\w+\s*){1,3}

El agrupador [] Indica un conjunto de caracteres que deben evaluarse. Al menos dos formas pueden usarse para crear el conjunto: Como una lista con el carácter -) y como disyunción con el carácter |. Por ejemplo:> Fátima Velis Guardado =>(\[A-Z]\w\s){1,3}

Esto abre la posibilidad de representación de algunos conocidos:

Carácter Funcionalidad Rango
\w Representa cualquier carácter alfanumérico. [A-Za-z0-9_]

Y de buscar coincidencias más específicas:

Conjunto Funcionalidad
[A-Z] Coincide únicamente con mayúsculas
[a-z] Coincide únicamente con minúsculas
[0-9] Números dígitos.

Las disyunciones son bastante útiles. Equivale a hacer una operación lógica OR: Coincidencia con a

echo ingeniera | egrep -o '^ingenier[a|o]$'

Coincidencia con o

echo ingeniero | egrep -o '^ingenier[a|o]$'

No hay coincidencia

echo ingenier2 | egrep -o '^ingenier[a|o]$'

Se destaca el hecho que los caracteres usados dependen en gran medida de la implementación de expresiones regulares que se use TODO *Exponer las diferentes implementaciones* Nosotros usaremos PCRE (Expresiones Regulares de Perl), que algunas ponen como Expresiones Extendidas. La mayoría de programas se adaptan de alguna forma a esta implementación: Aprenderla significa disponer de toda su potencia para un sin fin de tareas de administración

¿Como usarlas precisamente en consola?

Un problema recurrente con el uso de expresiones regulares en consola es el hecho que debemos controlar la implementación que usa, pero la documentación puede ser clara sobre como especificarla:

FIND

La poderosa herramienta find bien puede usarse con su opción name, e intenta algún tipo de wilcard sobre la búsqueda. Para acceder a la expresiones regulares extendidas, use -regextype posix-extended

find `pwd`  -regextype posix-extended -regex 

Implementaciones válidas para find: La lista es verdaderamente interesante:

`findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix minimal-basic', `sed'

AWK

awk bien requiere un artículo por si mismo. Por ahora bastara saber que es el comparador ~ el que nos permite hacer comparaciones con expresiones regulares. El manual es claro al decir que awk usa expresiones regulares como las que usa egrep. **TODO Sospecho que no funcionan tan bien como se esperaría.

echo "Esta es una cadena" | awk '$0~/(\w+\s*)*/ {print $0}'

SED

sed es otro poder oculto dentro de la consola. Basta con saber que es la opción -r la que nos permite usar expresiones regulares. Vea este ejemplo (Que no modificara para nada el contenido de /etc/passwd)

sed -r 's/[a-z]*:x(:([0-9]){3,4}){2}:/Contenido Cambiado :/' /etc/passwd

EGREP - GREP

Cuando use grep, añada la opción -E para que funcione tal como se espera de egrep, al menos en cuanto a expresiones regualares se refiere. Por lo demás, se comportará tal como todos en cuanto a las expresiones que puede formar:

La utilidad de grep a la hora de aprender a usar expresiones regulares

La opción -o hace que egrep tome tan solo aquellas partes de un texto a tratar que cumplan con la regla especificada, en lugar de la opción por defecto de mostrar toda la línea donde haya texto coincidente

egrep -o '^.*:x(:([0-9]){3}){2}:\w*\s\w*' /etc/passwd

RENAME

Rename en Debian (perl-rename en otras distribuciones, lo que de paso delata mucho su origen) es una simpática solución para renombrar grandes cantidades de ficheros desde consola. Por ejemplo, la adicción de sufijos para crear backup es tan sencillo como:

rename -n 's/$/\-bk/' *.sh

Demilitadores

Los demilitadores son el punto final de nuestro trabajo. Su uso supone la plena confianza en sus habilidades con expresiones regulares. ^ $

Lo más común es que tenga que usar en conjunto ^..resto de la expresion...$, con lo que estaría creando una expresión bastante estricta

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas