domingo, 6 de mayo de 2007

Reconocimiento extendido de patrones en bash

Antes que nada, de vuelta aquí escribiendo en el blog, después de unos días ocupados de escuela, pero ya estoy de vuelta y escribiendo esto desde mi nueva adquisición… Mi nueva laptop, una HP Pavilion (AMD Thurion 64 X2 de 1.6 Ghz., 1024mb de RAM, Tarjeta de video de 256mb nvidia) cabe decir que corre de maravilla.

Bueno regresando al tema del titulo (Reconocimiento extendido de patrones en bash), esto lo aprendí en un taller de bash cuando fuimos al Festival de Software Libre en Puerto Vallarta, si alguna vez has programado en algún lenguaje de scripting como Python o Perl entre otros, te será conocido el uso de expresiones regulares (pattern matching). El interprete de comandos de GNU/Linux, bash, no posee estas funciones avanzadas con este tipo de opciones. Aunque pueden habilitarse de con el uso del parámetro extglob, configurable como opción shopt de nuestro interprete de comandos.

Podemos habilitarla ejecutando en la Terminal la siguiente línea:

---------------------------------------

$ shopt –s extglob

---------------------------------------

O bien forzar el parámetro en la configuración de .bashrc añadiendo dicha línea de forma permanente en el arranque de nuestras siguientes sesiones.

Los patrones que podemos reconocer son similares a los que se utilizan en el comando egrep, y son los siguientes:

· ?(lista de patrones) : Mostrara el resultado si no encuentra o solo hace una única vez la lista de patrones.

· *(lista de patrones) : Si encuentra o no los patrones de la lista.

· +(lista de patrones) : Si encuentra los patrones una o mas veces.

· @(lista de patrones) : Localiza patrones de forma exacta.

· !(lista de patrones) : Localizara cualquier cosa, excepto las que contengan el patrón o patrones indicados en la lista.

Ejemplos:

Supongamos que queremos listar todos los archivos PDF o Postscript de un directorio, ejecutamos en la Terminal:

--------------------------------------------------

$ ls –l @(*.pdf|*.ps)

--------------------------------------------------

Si por el contrario queremos listar todos los archivos que no sean PDF o Postscrip:

--------------------------------------------------

$ ls –l !(*.p@(df|s))

--------------------------------------------------

Ejemplo 2:

Supongamos que queremos instalar todos los paquetes situados en un directorio que correspondan a nuestra arquitectura, aprovechando que los paquetes tendrán un nombre que indica la arquitectura, ejecutaremos:

Si nuestra distribución esta basada en Debian y utiliza paquetes .DEB

-----------------------------------------------------------

$ dpkg –i /home /usuario/paquetes/@(*i386*)

-----------------------------------------------------------

Ejemplo 3:

Para borrar un conjunto de archivos comprimidos o tareados ejecutamos:

---------------------------------

$ rm +(*.tar*|*.bz2|*.gz)

---------------------------------

Así, aunque un archivo este comprimido y tareado(su extensión es .TAR.BZ2) lo eliminaremos.