Mediante la herramienta sed podemos tratar ficheros mediante expresiones regular
es. Vamos a ver como tratar ms de una linea o por bloques. En el caso que necesitemos obtener un bloque de texto que identifiquemos mediant e inicio y final, podemos usar dos expresiones separadas por coma para indicar e l bloque. Tomando de ejemplo el siguiente fichero: texto inicial inicio texto dentro final texto final Podramos hacer: $ cat fichero | sed -n '/inicio/,/final/p' inicio texto dentro final En el caso que necesitemos tratar la cadena, deberemos aadir el modificador N par a hacer la expresin multilinea, por ejemplo, cambiamos $ cat fichero | sed 'N;s/texto dentro\nfinal/sin texto/g' inicial inicio sin texto texto final --------------------------------------------- El punto "." Cualquier carcter - "g.t" + "el gato de piedra en la gtica puerta de getisboro goo t" = "gat", "gt" y por ltimo "get" Ntese que el motor de bsqueda no encuentra "goot "; esto es porque el punto representa un solo carcter y nicamente uno. --------------------------------------------- La barra inversa o contrabarra "\" Se utiliza para "marcar" el siguiente carcter de la expresin de bsqueda de forma qu e este adquiera un significado especial o deje de tenerlo. \t Representa un tabulador. \r Representa el "retorno de carro" o "regreso al inicio" o sea el lugar en que la lnea vuelve a iniciar. \n Representa la "nueva lnea" el carcter por medio del cual una lnea da inicio. Es necesario recordar que en Windows es necesaria una combinacin de \r\n para comenz ar una nueva lnea, mientras que en Unix solamente se usa \n y en Mac_OS clsico se usa solamente \r. \a Representa una "campana" o "beep" que se produce al imprimir este carcter. \e Representa la tecla "Esc" o "Escape" \f Representa un salto de pgina \v Representa un tabulador vertical \x Se utiliza para representar caracteres ASCII o ANSI si conoce su cdigo. De est a forma, si se busca el smbolo de derechos de autor y la fuente en la que se busc a utiliza el conjunto de caracteres Latin-1 es posible encontrarlo utilizando "\ xA9". \u Se utiliza para representar caracteres Unicode si se conoce su cdigo. "\u00A2" representa el smbolo de centavos. No todos los motores de Expresiones Regulares soportan Unicode. El .Net Framework lo hace, pero el EditPad Pro no, por ejemplo . \d Representa un dgito del 0 al 9. \w Representa cualquier carcter alfanumrico. \s Representa un espacio en blanco. \D Representa cualquier carcter que no sea un dgito del 0 al 9. \W Representa cualquier carcter no alfanumrico. \S Representa cualquier carcter que no sea un espacio en blanco. \A Representa el inicio de la cadena. No un carcter sino una posicin. \Z Representa el final de la cadena. No un carcter sino una posicin. \b Marca el inicio y el final de una palabra. \B Marca la posicin entre dos caracteres alfanumricos o dos no-alfanumricos. --------------------------------------------- Los corchetes "[ ]" La funcin de los corchetes en el lenguaje de las expresiones regulares es represe ntar "clases de caracteres", o sea, agrupar caracteres en grupos o clases. Son tiles cuando es necesario buscar uno de un grupo de caracteres. Dentro de los corchetes es posible utilizar el guion "-" para especificar rangos de caractere s. Adicionalmente, los metacaracteres pierden su significado y se convierten en literales cuando se encuentran dentro de los corchetes. Por ejemplo, como vimos en la entrega anterior "\d" nos es til para buscar cualquier carcter que represent e un dgito. Sin embargo esta denominacin no incluye el punto "." que divide la par te decimal de un nmero. Para buscar cualquier carcter que representa un dgito o un punto podemos utilizar la expresin regular "[\d.]". Como se hizo notar anteriorme nte, dentro de los corchetes, el punto representa un carcter literal y no un meta carcter, por lo que no es necesario antecederlo con la barra inversa. El nico carct er que es necesario anteceder con la barra inversa dentro de los corchetes es la propia barra inversa. La expresin regular "[\dA-Fa-f]" nos permite encontrar dgit os hexadecimales. Los corchetes nos permiten tambin encontrar palabras an si estn e scritas de forma errnea, por ejemplo, la expresin regular "expresi[o]n" permite enc ontrar en un texto la palabra "expresin" aunque se haya escrito con o sin tilde. Es necesario aclarar que sin importar cuantos caracteres se introduzcan dentro d el grupo por medio de los corchetes, el grupo slo le dice al motor de bsqueda que encuentre un solo carcter a la vez, es decir, que "expresi[o]n" no encontrar "expre sioon" o "expresion". --------------------------------------------- La barra "|" Sirve para indicar una de varias opciones. Por ejemplo, la expresin regular "a|e" encontrar cualquier "a" o "e" dentro del texto. La expresin regular "este|oeste|n orte|sur" permitir encontrar cualquiera de los nombres de los puntos cardinales. La barra se utiliza comnmente en conjunto con otros caracteres especiales. --------------------------------------------- El signo de dlar "$" Representa el final de la cadena de caracteres o el final de la lnea, si se utili za el modo multi-lnea. No representa un carcter en especial sino una posicin. Si se utiliza la expresin regular "\.$" el motor encontrar todos los lugares donde un p unto finalice la lnea, lo que es til para avanzar entre prrafos. --------------------------------------------- El acento circunflejo "^" Este carcter tiene una doble funcionalidad, que difiere cuando se utiliza individ ualmente y cuando se utiliza en conjunto con otros caracteres especiales. En pri mer lugar su funcionalidad como carcter individual: el carcter "^" representa el i nicio de la cadena (de la misma forma que el signo de dlar "$" representa el fina l de la cadena). Por tanto, si se utiliza la expresin regular "^[a-z]" el motor e ncontrar todos los prrafos que den inicio con una letra minscula. Cuando se utiliza en conjunto con los corchetes de la siguiente forma "[^\w ]" permite encontrar cualquier carcter que NO se encuentre dentro del grupo indicado. La expresin indic ada permite encontrar, por ejemplo, cualquier carcter que no sea alfanumrico o un espacio, es decir, busca todos los smbolos de puntuacin y dems caracteres especiale s. La utilizacin en conjunto de los caracteres especiales "^" y "$" permite realizar validaciones en forma sencilla. Por ejemplo "^\d$" permite asegurar que la cade na a verificar representa un nico dgito "^\d\d/\d\d/\d\d\d\d$" permite validar una fecha en formato corto, aunque no permite verificar si es una fecha vlida, ya qu e 99/99/9999 tambin sera vlido en este formato; la validacin completa de una fecha t ambin es posible mediante expresiones regulares, como se ejemplifica ms adelante. --------------------------------------------- Los parntesis "()" De forma similar que los corchetes, los parntesis sirven para agrupar caracteres, sin embargo existen varias diferencias fundamentales entre los grupos estableci dos por medio de corchetes y los grupos establecidos por parntesis: Los caracteres especiales conservan su significado dentro de los parntesis. Los grupos establecidos con parntesis establecen una "etiqueta" o "punto de refer encia" para el motor de bsqueda que puede ser utilizada posteriormente como se de nota ms adelante. Utilizados en conjunto con la barra "|" permite hacer bsquedas opcionales. Por ej emplo la expresin regular "al (este|oeste|norte|sur) de" permite buscar textos qu e den indicaciones por medio de puntos cardinales, mientras que la expresin regul ar "este|oeste|norte|sur" encontrara "este" en la palabra "esteban", no pudiendo cumplir con este propsito. Utilizados en conjunto con otros caracteres especiales que se detallan posterior mente, ofrece funcionalidad adicional. --------------------------------------------- El signo de interrogacin "?" El signo de interrogacin tiene varias funciones dentro del lenguaje de las expres iones regulares. La primera de ellas es especificar que una parte de la bsqueda e s opcional. Por ejemplo, la expresin regular "ob?scuridad" permite encontrar tant o "oscuridad" como "obscuridad". En conjunto con los parntesis redondos permite e specificar que un conjunto mayor de caracteres es opcional; por ejemplo "Nov(\.| iembre|ember)?" permite encontrar tanto "Nov" como "Nov.", "Noviembre" y "Novemb er". Como se mencion anteriormente, los parntesis nos permiten establecer un "punto de referencia" para el motor de bsqueda. Sin embargo, algunas veces, no se desea uti lizarlos con este propsito, como en el ejemplo anterior "Nov(\.|iembre|ember)?". En este caso el establecimiento de este punto de referencia (que se detalla ms ad elante) representa una inversin intil de recursos por parte del motor de bsqueda. P ara evitarlo se puede utilizar el signo de pregunta de la siguiente forma: "Nov( ?:\.|iembre|ember)?". Aunque el resultado obtenido ser el mismo, el motor de bsque da no realizar una inversin intil de recursos en este grupo, sino que lo ignorar. Cu ando no sea necesario reutilizar el grupo, es aconsejable utilizar este formato. De forma similar, es posible utilizar el signo de pregunta con otro significado : Los parntesis definen grupos "annimos", sin embargo el signo de pregunta en conj unto con los parntesis triangulares "<>" permite "nombrar" estos grupos de la sig uiente forma: "^(?<Da>\d\d)/(?<Mes>\d\d)/(?<Ao>\d\d\d\d)$"; Con lo cual se le espe cifica al motor de bsqueda que los primeros dos dgitos encontrados llevarn la etiqu eta "Da", los segundos la etiqueta "Mes" y los ltimos cuatro dgitos llevarn la etiqu eta "Ao". NOTA: a pesar de la complejidad y flexibilidad dada por los caracteres especiale s estudiados hasta ahora, en su mayora nos permiten encontrar solamente un carcter a la vez, o un grupo de caracteres a la vez. Los metacaracteres enumerados en a delante permiten establecer repeticiones. --------------------------------------------- Las llaves "{}" Comnmente las llaves son caracteres literales cuando se utilizan por separado en una expresin regular. Para que adquieran su funcin de metacaracteres es necesario que encierren uno o varios nmeros separados por coma y que estn colocados a la der echa de otra expresin regular de la siguiente forma: "\d{2}" Esta expresin le dice al motor de bsqueda que encuentre dos dgitos contiguos. Utilizando esta frmula pod ramos convertir el ejemplo "^\d\d/\d\d/\d\d\d\d$" que serva para validar un format o de fecha en "^\d{2}/\d{2}/\d{4}$" para una mayor claridad en la lectura de la expresin. "\d{2,4}" Esta forma aade un segundo nmero separado por una coma, el cul indica al motor de bsqueda que como mximo debe aparecer 4 veces la expresin regular \d. Los p osibles valores son: "^\d\d$" (mnimo 2 repeticiones) "^\d\d\d$"(tiene 3 repeticiones, por lo tanto entra en el rango 2-4) "^\d\d\d\d$" (mximo 4 repeticiones) Nota: aunque esta forma de encontrar elementos repetidos es muy til, algunas vece s no se conoce con claridad cuantas veces se repite lo que se busca o su grado d e repeticin es variable. En estos casos los siguientes metacaracteres son tiles. --------------------------------------------- El asterisco "*" El asterisco sirve para encontrar algo que se encuentra repetido 0 o ms veces. Po r ejemplo, utilizando la expresin "[a-zA-Z]\d*" ser posible encontrar tanto "H" co mo "H1", "H01", "H100" y "H1000", es decir, una letra seguida de un nmero indefin ido de dgitos. Es necesario tener cuidado con el comportamiento del asterisco, ya que ste, por defecto, trata de encontrar la mayor cantidad posible de caracteres que correspondan con el patrn que se busca. De esta forma si se utiliza "\(.*\)" para encontrar cualquier cadena que se encuentre entre parntesis y se lo aplica sobre el texto "Ver (Fig. 1) y (Fig. 2)" se esperara que el motor de bsqueda encue ntre los textos "(Fig. 1)" y "(Fig. 2)", sin embargo, debido a esta caracterstica , en su lugar encontrar el texto "(Fig. 1) y (Fig. 2)". Esto sucede porque el ast erisco le dice al motor de bsqueda que llene todos los espacios posibles entre lo s dos parntesis. Para obtener el resultado deseado se debe utilizar el asterisco en conjunto con el signo de interrogacin de la siguiente forma: "\(.*?\)" Esto es equivalente a decirle al motor de bsqueda que "Encuentre un parntesis de apertura y luego encuentre cualquier secuencia de caracteres hasta que encuentre un parnt esis de cierre". --------------------------------------------- El signo de suma "+" Se utiliza para encontrar una cadena que se encuentre repetida una o ms veces. A diferencia del asterisco, la expresin "[a-zA-Z]\d+" encontrar "H1" pero no encontr ar "H". Tambin es posible utilizar este metacarcter en conjunto con el signo de int errogacin para limitar hasta donde se efecta la repeticin. --------------------------------------------- Expresiones regulares en bash Mediante bash sin utilizar otros programas como grep podemos utilizar expresione s regulares. Mediante el operador =~ podemos comparar una cadena contra una expresin regular, por ejemplo: $ if [[ qwerty =~ [0-9]+ ]]; then echo match; else echo fail; fi fail $ if [[ qwerty =~ [a-z]+ ]]; then echo match; else echo fail; fi match La expresin regular no debe ir entre comillas. Podemos utilizar una variable para evitar escapar los parntesis y dems caracteres especiales: (...) REGEX="^systemadmin\.es-[a-z0-9]+-[a-z]+$" if [[ $cadena =~ $REGEX ]]; (...) ---------------------------------------------