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