Você está na página 1de 5

sed con multiples lineas

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 ]];
(...)
---------------------------------------------

Você também pode gostar