Stream Editor - Expresiones regulares
Son las expresiones regulares las que hacen que SED sea potente y eficiente. Se pueden resolver varias tareas complejas con expresiones regulares. Cualquier experto en línea de comandos conoce el poder de las expresiones regulares.
Como muchas otras utilidades de GNU / Linux, SED también admite expresiones regulares, que a menudo se denominan regex. Este capítulo describe las expresiones regulares en detalle. El capítulo se divide en tres secciones: expresiones regulares estándar, clases POSIX de expresiones regulares y metacaracteres.
Expresiones regulares estándar
Inicio de línea (^)
En la terminología de expresiones regulares, el símbolo de intercalación (^) coincide con el comienzo de una línea. El siguiente ejemplo imprime todas las líneas que comienzan con el patrón "The".
[jerry]$ sed -n '/^The/ p' books.txt
Al ejecutar el código anterior, obtiene el siguiente resultado:
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
Fin de línea ($)
El final de la línea está representado por el símbolo de dólar ($). El siguiente ejemplo imprime las líneas que terminan con "Coelho".
[jerry]$ sed -n '/Coelho$/ p' books.txt
Al ejecutar el código anterior, obtiene el siguiente resultado:
The Alchemist, Paulo Coelho
The Pilgrimage, Paulo Coelho
Carácter único (.)
El punto (.) Coincide con cualquier carácter, excepto el carácter de final de línea. El siguiente ejemplo imprime las palabras de tres letras que terminan con el carácter "t".
[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
cat
bat
rat
mat
Coincidir juego de caracteres ([])
En terminología de expresiones regulares, un juego de caracteres se representa mediante corchetes ([]). Se utiliza para hacer coincidir solo uno de varios caracteres. El siguiente ejemplo coincide con los patrones "Call" y "Tall" pero no con "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Call
Tall
Conjunto exclusivo ([^])
En conjunto exclusivo, el símbolo de intercalación niega el conjunto de caracteres entre corchetes. El siguiente ejemplo imprime solo "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Ball
Rango de caracteres ([-])
Cuando se proporciona un rango de caracteres, la expresión regular coincide con cualquier carácter dentro del rango especificado entre corchetes. El siguiente ejemplo coincide con "Call" y "Tall" pero no con "Ball".
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Call
Tall
Ahora modifiquemos el rango a "AP" y observemos el resultado.
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Call
Ball
Cero en una ocurrencia (\?)
En SED, el signo de interrogación (\?) Coincide con cero o una aparición del carácter anterior. El siguiente ejemplo coincide con "Behavior" y con "Behavior". Aquí, hicimos "u" como un carácter opcional usando "\?".
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Behaviour
Behavior
Una o más ocurrencias (\ +)
En SED, el símbolo más (\ +) coincide con una o más ocurrencias del carácter anterior. El siguiente ejemplo coincide con una o más apariciones de "2".
[jerry]$ echo -e "111\n22\n123\n234\n456\n222" | sed -n '/2\+/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
22
123
234
222
Cero o más ocurrencia (*)
Los asteriscos (*) coinciden con la aparición de cero o más del carácter anterior. El siguiente ejemplo coincide con "ca", "cat", "catt", etc.
[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
ca
cat
Exactamente N apariciones {n}
{n} coincide exactamente con "n" apariciones del carácter anterior. El siguiente ejemplo imprime solo números de tres dígitos. Pero antes de eso, debe crear el siguiente archivo que contiene solo números.
[jerry]$ cat numbers.txt
Al ejecutar el código anterior, obtiene el siguiente resultado:
1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
Escribamos la expresión SED.
[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt
Al ejecutar el código anterior, obtiene el siguiente resultado:
100
Tenga en cuenta que el carácter "\" escapa al par de llaves.
Al menos n apariciones {n,}
{n,} coincide con al menos "n" apariciones del carácter anterior. El siguiente ejemplo imprime todos los números mayores o iguales a cinco dígitos.
[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt
Al ejecutar el código anterior, obtiene el siguiente resultado:
10000
100000
1000000
10000000
100000000
1000000000
Ocurrencia de M a N {m, n}
{m, n} coincide con al menos "m" y como máximo "n" apariciones del carácter anterior. El siguiente ejemplo imprime todos los números que tienen al menos cinco dígitos pero no más de ocho dígitos.
[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt
Al ejecutar el código anterior, obtiene el siguiente resultado:
10000
100000
1000000
10000000
Tubería (|)
En SED, el carácter de tubería se comporta como una operación lógica OR. Coincide con elementos de ambos lados de la tubería. El siguiente ejemplo coincide con "str1" o "str3".
[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
str1
str3
Tenga en cuenta que el par de paréntesis y barra vertical (|) se escapa con el carácter "\".
Personajes que escapan
Hay ciertos personajes especiales. Por ejemplo, la nueva línea está representada por "\ n", el retorno de carro está representado por "\ r", y así sucesivamente. Para usar estos caracteres en un contexto ASCII normal, tenemos que escapar de ellos usando el carácter de barra invertida (\). Este capítulo ilustra el escape de caracteres especiales.
Escapar de "\"
El siguiente ejemplo coincide con el patrón "\".
[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
str1\str2
Escapar de "\ n"
El siguiente ejemplo coincide con el carácter de nueva línea.
[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
str1\nstr2
Escapar de "\ r"
El siguiente ejemplo coincide con el retorno de carro.
[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
str1\rstr2
Escapando de "\ dnnn"
Coincide con un carácter cuyo valor ASCII decimal es "nnn". El siguiente ejemplo sólo coincide con el carácter "a".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
a
Escapando de "\ onnn"
Esto coincide con un carácter cuyo valor ASCII octal es "nnn". El siguiente ejemplo solo coincide con el carácter "b".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
b
Esto coincide con un carácter cuyo valor ASCII hexadecimal es "nnn". El siguiente ejemplo sólo coincide con el carácter "c".
[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
c
Clases POSIX de expresiones regulares
Hay ciertas palabras reservadas que tienen un significado especial. Estas palabras reservadas se denominan clases POSIX de expresión regular. Esta sección describe las clases POSIX admitidas por SED.
[: alnum:]
Implica caracteres alfabéticos y numéricos. El siguiente ejemplo solo coincide con "Uno" y "123", pero no con el carácter de tabulación.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
One
123
[:alfa:]
Implica únicamente caracteres alfabéticos. El siguiente ejemplo solo coincide con la palabra "Uno".
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
One
[:blanco:]
Implica un carácter en blanco que puede ser espacio o tabulación. El siguiente ejemplo solo coincide con el carácter de tabulación.
[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte
Al ejecutar el código anterior, obtiene el siguiente resultado:
^I$
Tenga en cuenta que el comando "cat -vte" se utiliza para mostrar los caracteres de tabulación (^ I).
[:dígito:]
Implica solo números decimales. El siguiente ejemplo solo coincide con el dígito "123".
[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
123
[:inferior:]
Implica solo letras minúsculas. El siguiente ejemplo sólo coincide con "uno".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
one
[:Superior:]
Implica solo letras mayúsculas. El siguiente ejemplo sólo coincide con "DOS".
[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
TWO
[: puntuar:]
Implica signos de puntuación que incluyen caracteres alfanuméricos o sin espacios.
[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
One,Two
[:espacio:]
Implica caracteres de espacio en blanco. El siguiente ejemplo lo ilustra.
[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte
Al ejecutar el código anterior, obtiene el siguiente resultado:
123^L^I$
Metacaracteres
Como las expresiones regulares tradicionales, SED también admite metacaracteres. Estas son expresiones regulares de estilo Perl. Tenga en cuenta que la compatibilidad con metacaracteres es específica de GNU SED y es posible que no funcione con otras variantes de SED. Analicemos los metacaracteres en detalle.
Límite de palabra (\ b)
En terminología de expresiones regulares, "\ b" coincide con el límite de la palabra. Por ejemplo, "\ bthe \ b" coincide con "the" pero no con "these", "there", "they", "then", etc. El siguiente ejemplo lo ilustra.
[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
the
Límite sin palabras (\ B)
En la terminología de las expresiones regulares, "\ B" coincide con el límite sin palabras. Por ejemplo, "la \ B" coincide con "estos" y "ellos" pero no con "el". El siguiente ejemplo lo ilustra.
[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
these
they
Espacio en blanco único (\ s)
En SED, "\ s" implica un solo carácter de espacio en blanco. El siguiente ejemplo coincide con "Línea \ t1" pero no con "Línea1".
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Line 1
Un solo espacio no en blanco (\ S)
En SED, "\ S" implica un único carácter de espacio en blanco. El siguiente ejemplo coincide con "Línea2" pero no con "Línea \ t1".
[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
Line2
Carácter de una sola palabra (\ w)
En SED, "\ w" implica un carácter de una sola palabra, es decir, caracteres alfabéticos, dígitos y guión bajo (_). El siguiente ejemplo lo ilustra.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
One
123
1_2
Carácter único que no es una palabra (\ W)
En SED, "\ W" implica un carácter único que no es una palabra que es exactamente opuesto a "\ w". El siguiente ejemplo lo ilustra.
[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
&;#
Comienzo del espacio de patrón (\ `)
En SED, "\` "implica el comienzo del espacio del patrón. El siguiente ejemplo solo coincide con la palabra "Uno".
[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'
Al ejecutar el código anterior, obtiene el siguiente resultado:
One