Stream Editor: búfer de patrones

Una de las operaciones básicas que realizamos en cualquier archivo es mostrar su contenido. Para ello, podemos utilizar elprintcomando que imprime el contenido del búfer de patrones. Aprendamos más sobre el búfer de patrones

Primero cree un archivo que contenga el número de línea, el nombre del libro, su autor y el número de páginas. En este tutorial, usaremos este archivo. Puede utilizar cualquier archivo de texto según su conveniencia. Nuestro archivo de texto se verá así:

[jerry]$ vi books.txt 
1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
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

Ahora imprimamos el contenido del archivo.

[jerry]$ sed 'p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

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

Quizás se pregunte por qué cada línea se muestra dos veces. Averigüemos.

¿Recuerdas el flujo de trabajo de SED? De forma predeterminada, SED imprime el contenido del búfer de patrones. Además, hemos incluido un comando de impresión explícitamente en nuestra sección de comandos. Por tanto, cada línea se imprime dos veces. Pero no se preocupe. SED tiene el-nopción para suprimir la impresión predeterminada del búfer de patrones. El siguiente comando lo ilustra.

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

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

1) A Storm of Swords, George R. R. Martin, 1216 
2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
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

¡Felicidades! obtuvimos el resultado esperado. Por defecto, SED opera en todas las líneas. Pero podemos obligar a SED a operar solo en ciertas líneas. Por ejemplo, en el ejemplo siguiente, SED solo funciona en la tercera línea. En este ejemplo, hemos especificado un rango de direcciones antes del comando SED.

[jerry]$ sed -n '3p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

3) The Alchemist, Paulo Coelho, 197

Además, también podemos indicarle a SED que imprima solo ciertas líneas. Por ejemplo, el siguiente código imprime todas las líneas de 2 a 5. Aquí hemos usado el operador coma (,) para especificar el rango de direcciones.

[jerry]$ sed -n '2,5 p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
5) The Pilgrimage, Paulo Coelho, 288

También hay un carácter especial dólar ($) que representa la última línea del archivo. Así que imprimamos la última línea del archivo.

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

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

6) A Game of Thrones, George R. R. Martin, 864

Sin embargo, también podemos usar el carácter Dólar ($) para especificar el rango de direcciones. El siguiente ejemplo imprime desde la línea 3 hasta la última línea.

[jerry]$ sed -n '3,$ p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

3) The Alchemist, Paulo Coelho, 197 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

Aprendimos a especificar un rango de direcciones usando el operador coma (,). SED admite dos operadores más que se pueden utilizar para especificar el rango de direcciones. Primero está el operador más (+) y se puede usar con el operador coma (,). Por ejemploM, +n imprimirá el siguiente n líneas a partir del número de línea M. ¿Suena confuso? Comprobémoslo con un ejemplo sencillo. El siguiente ejemplo imprime las siguientes 4 líneas a partir de la línea número 2.

[jerry]$ sed -n '2,+4 p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

2) The Two Towers, J. R. R. Tolkien, 352 
3) The Alchemist, Paulo Coelho, 197 
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

Opcionalmente, también podemos especificar el rango de direcciones usando el operador tilde (~). UsaM~nformar. Indica que la SED debe comenzar en la línea número M y procesar cada n (ésima) línea. Por ejemplo,50~5coincide con el número de línea 50, 55, 60, 65, etc. Imprimamos solo líneas impares del archivo.

[jerry]$ sed -n '1~2 p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

1) A Storm of Swords, George R. R. Martin, 1216 
3) The Alchemist, Paulo Coelho, 197 
5) The Pilgrimage, Paulo Coelho, 288

El siguiente código imprime solo líneas pares del archivo.

[jerry]$ sed -n '2~2 p' books.txt

Cuando se ejecuta el código anterior, producirá el siguiente resultado.

2) The Two Towers, J. R. R. Tolkien, 352 
4) The Fellowship of the Ring, J. R. R. Tolkien, 432 
6) A Game of Thrones, George R. R. Martin, 864