Stream Editor - Caracteres especiales

SED proporciona dos caracteres especiales que se tratan como comandos. Este capítulo ilustra el uso de estos dos caracteres especiales.

= Comando

El comando "=" se ocupa de los números de línea. A continuación se muestra la sintaxis del comando "=":

[/pattern/]= 
[address1[,address2]]=

El comando = escribe el número de línea seguido de su contenido en el flujo de salida estándar. El siguiente ejemplo lo ilustra.

[jerry]$ sed '=' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5 
5) The Pilgrimage, Paulo Coelho, 288 
6 
6) A Game of Thrones, George R. R. Martin, 864

Imprimamos los números de línea y el contenido de las primeras cuatro líneas. El siguiente comando imprime las primeras cuatro líneas con números de línea y el resto sin números de línea.

[jerry]$ sed '1, 4=' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

1 
1) A Storm of Swords, George R. R. Martin, 1216 
2 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

Además, podemos indicarle al SED que imprima los números de línea cuando una coincidencia de patrón tiene éxito. El siguiente ejemplo imprime el número de línea que contiene el patrón "Paulo".

[jerry]$ sed '/Paulo/ =' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5 
5) The Pilgrimage, Paulo Coelho, 288 
6) A Game of Thrones, George R. R. Martin, 864

¿Puedes adivinar lo que hace el siguiente comando SED?

[jerry]$ sed -n '$ =' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

6

Sí, tiene usted razón. Cuenta el número total de líneas presentes en el archivo. Desmitifiquemos el código. En la sección de comandos, usamos "$ =" que imprime el número de línea de la última línea seguido de su contenido. Pero también proporcionamos-n bandera que suprime la impresión predeterminada del búfer de patrones. Por lo tanto, solo se muestra el último número de línea.

& Comando

SED admite el carácter especial &. Siempre que una coincidencia de patrón tiene éxito, este carácter especial almacena el patrón coincidente. A menudo se usa con el comando de sustitución. Veamos cómo podemos aprovechar esta función eficiente.

Cada línea del archivo book.txt está numerada. Agreguemos las palabrasBook numberal principio de cada línea. El siguiente ejemplo lo ilustra.

[jerry]$ sed 's/[[:digit:]]/Book number &/' books.txt

Al ejecutar el código anterior, obtiene el siguiente resultado:

Book number 1) A Storm of Swords, George R. R. Martin, 1216 
Book number 2) The Two Towers, J. R. R. Tolkien, 352 
Book number 3) The Alchemist, Paulo Coelho, 197 
Book number 4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
Book number 5) The Pilgrimage, Paulo Coelho, 288 
Book number 6) A Game of Thrones, George R. R. Martin, 864

Este ejemplo es muy sencillo. Primero, buscamos la primera aparición de un dígito, que es el número de línea (por eso usamos [[: dígito:]]) y el SED almacena automáticamente el patrón coincidente en el carácter especial &. En el segundo paso, insertamos las palabrasBook number antes de cada patrón coincidente, es decir, antes de cada línea.

Tomemos otro ejemplo. En el archivo book.txt, el último dígito implica el número de páginas del libro. Agreguemos "Pages =" antes de eso. Para hacer esto, busque la última aparición del dígito y reemplácelo con "Pages = &". Aquí, & almacena el patrón coincidente, es decir, el número de páginas

[jerry]$ sed 's/[[:digit:]]*$/Pages = &/' books.txt

Al ejecutar la sintaxis anterior, obtiene el siguiente resultado:

1) A Storm of Swords, George R. R. Martin, Pages = 1216 
2) The Two Towers, J. R. R. Tolkien, Pages = 352 
3) The Alchemist, Paulo Coelho, Pages = 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, Pages = 432 
5) The Pilgrimage, Paulo Coelho,Pages = 288 
6) A Game of Thrones, George R. R. Martin, Pages = 864

Por el momento, solo recuerda que [[:digit:]]*$encuentra la última aparición del dígito. En el capítulo "Expresiones regulares, exploraremos más sobre las expresiones regulares.