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.