Stream Editor: gestión de patrones

Ya hemos discutido el uso de patrón y retención de búfer. En este capítulo, exploraremos más sobre su uso. Discutamos elncomando que imprime el espacio del patrón. Se utilizará junto con otros comandos. A continuación se muestra la sintaxis del comando then.

[address1[,address2]]n

Tomemos un ejemplo.

[jerry]$ sed 'n' 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

los n El comando imprime el contenido del búfer de patrones, borra el búfer de patrones, recupera la siguiente línea en el búfer de patrones y aplica comandos en él.

Consideremos que hay tres comandos SED antes n y dos comandos SED después n como sigue:

Sed command #1 
Sed command #2 
Sed command #3 
n command 
Sed command #4 
Sed command #5

En este caso, SED aplica los primeros tres comandos en el búfer de patrones, borra el búfer de patrones, recupera la siguiente línea en el búfer de patrones y luego aplica los comandos cuarto y quinto en él. Este es un concepto muy importante. No continúe sin tener una comprensión clara de esto.

El búfer de retención contiene datos, pero los comandos SED no se pueden aplicar directamente en el búfer de retención. Por lo tanto, necesitamos llevar los datos del búfer de retención al búfer de patrón. SED proporcionaxcomando para intercambiar el contenido del patrón y mantener búferes. Los siguientes comandos ilustranx mando.

Modifiquemos ligeramente el archivo books.txt. Digamos que el archivo contiene títulos de libros seguidos de los nombres de sus autores. Después de la modificación, el archivo debería verse así:

[jerry]$ cat books.txt

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

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage 
Paulo Coelho 
A Game of Thrones 
George R. R. Martin

Intercambiemos el contenido de los dos búferes. Por ejemplo, el siguiente ejemplo imprime solo los nombres de los autores.

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

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

George R. R. Martin 
J. R. R. Tolkien 
Paulo Coelho 
J. R. R. Tolkien 
Paulo Coelho 
George R. R. Martin

Entendamos cómo funciona este comando.

  • Inicialmente, SED lee la primera línea, es decir, A Storm of Swords en el búfer de patrones.

  • x El comando mueve esta línea al búfer de retención.

  • n obtiene la siguiente línea, es decir, George RR Martin en el búfer de patrones.

  • El control pasa al comando seguido de n que imprime el contenido del búfer de patrones.

  • El proceso se repite hasta que se agota el archivo.

Ahora intercambiemos el contenido de los búferes antes de imprimir. Adivina, ¿qué pasa? Sí, imprime los títulos de los libros.

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

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

A Storm of Swords 
The Two Towers 
The Alchemist 
The Fellowship of the Ring 
The Pilgrimage 
A Game of Thrones

los hEl comando se ocupa del búfer de retención. Copia datos del búfer de patrones al búfer de retención. Los datos existentes del búfer de retención se sobrescriben. Tenga en cuenta que elhEl comando no mueve datos, solo copia datos. Por lo tanto, los datos copiados permanecen como están en el búfer de patrones. A continuación se muestra la sintaxis de lah mando.

[address1[,address2]]h

El siguiente comando imprime solo los títulos del autor Paulo Coelho.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;p}' books.txt

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

The Alchemist 
The Pilgrimage

Entendamos cómo funciona el comando anterior. El contenido de books.txt sigue un formato específico. La primera línea es el título del libro seguido por el autor del libro. En el comando anterior, "!" se usa para revertir la condición, es decir, la línea se copia al búfer de retención solo cuando una coincidencia de patrón no tiene éxito. Y las llaves {} se utilizan para agrupar varios comandos SED

En la primera pasada del comando, SED lee la primera línea, es decir, A Storm of Swords en el búfer de patrones y verifica si contiene el patrón Paulo o no. Como la coincidencia de patrones no se realiza correctamente, copia esta línea en el búfer de retención. Ahora tanto el búfer de patrón como el búfer de retención contienen la misma línea, es decir, A Storm of Swords. En el segundo paso, comprueba si la línea contiene el patrón Paulo o no. Como el patrón no coincide, no hace nada.

En la segunda pasada, lee la siguiente línea George RR Martin en el búfer de patrones y aplica los mismos pasos. Durante las siguientes tres líneas, hace lo mismo. Al final de la quinta pasada, ambos búferes contienen The Alchemist. Al comienzo de la sexta pasada, lee la línea Paulo Coelho y cuando el patrón coincide, no copia esta línea en el búfer de retención. Por lo tanto, el búfer de patrones contiene a Paulo Coelho y el búfer de retención contiene The Alchemist.

A continuación, comprueba si el búfer de patrones contiene el patrón Paulo. A medida que la coincidencia de patrones tiene éxito, intercambia el contenido del búfer de patrón con el búfer de retención. Ahora el búfer de patrones contiene The Alchemist y el búfer de retención contiene Paulo Coelho. Finalmente, imprime el contenido del búfer de patrones. Los mismos pasos se aplican al patrón The Pilgrimage.

los hcomando destruye el contenido anterior del búfer de retención. Esto no siempre es aceptable, ya que a veces necesitamos preservar el contenido. Para este propósito, SED proporciona laHcomando que agrega el contenido al búfer de retención agregando una nueva línea al final. La única diferencia entreh y Hes decir, el primero sobrescribe los datos del búfer de retención, mientras que el último agrega datos al búfer de retención. Su sintaxis es similar a lah mando.

[address1[,address2]]H

Tomemos otro ejemplo. Esta vez, en lugar de imprimir solo títulos de libros, imprima también los nombres de sus autores. El siguiente ejemplo imprime los títulos de los libros seguidos de sus nombres de autor.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{H;x;p}' books.txt

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

The Alchemist 
Paulo Coelho 
The Pilgrimage
Paulo Coelho

Aprendimos cómo copiar / agregar el contenido del búfer de patrones para contener el búfer. ¿Podemos realizar también la función inversa? ¡Sí, ciertamente! Para este propósito, SED proporciona lagcomando que copia datos del búfer de retención al búfer de patrones. Durante la copia, se sobrescriben los datos existentes del espacio de patrones. A continuación se muestra la sintaxis de lag mando.

[address1[,address2]]g

Consideremos el mismo ejemplo: imprimir títulos de libros y sus autores. Esta vez imprimiremos primero el nombre del autor y en la siguiente línea el título del libro correspondiente. El siguiente comando imprime el nombre del autor Paulo Coelho, seguido del título del libro.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{p;g;p}' books.txt

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

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

El primer comando se mantiene como está. Al final del quinto paso, ambos búferes contienen El alquimista. Al comienzo de la sexta pasada, lee la línea Paulo Coelho y cuando el patrón coincide, no copia esta línea en el búfer de retención. Por lo tanto, el espacio de patrón contiene a Paulo Coelho y el espacio de espera contiene a The Alchemist.

A continuación, comprueba si el espacio del patrón contiene el patrón Paulo. Cuando la coincidencia de patrones tiene éxito, primero imprime el contenido del espacio de patrones, es decir, Paulo Coelho, luego copia el búfer de retención en el búfer de patrones. Por lo tanto, tanto el patrón como los búferes de retención contienen The Alchemist. Finalmente, imprime el contenido del búfer de patrones. Los mismos pasos se aplican al patrón The Pilgrimage.

De manera similar, podemos agregar el contenido del búfer de retención al búfer de patrón. SED proporcionaG comando que agrega el contenido al búfer de patrones agregando una nueva línea al final.

[address1[,address2]]G

Tomemos ahora el ejemplo anterior que imprime el nombre del autor Paulo Coelhof seguido del título de su libro. Para lograr el mismo resultado, ejecute el siguiente comando SED.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{G;p}' books.txt

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

Paulo Coelho 
The Alchemist 
Paulo Coelho 
The Pilgrimage

¿Puede modificar el ejemplo anterior para mostrar los títulos de los libros seguidos por sus autores? Simple, simplemente intercambie el contenido del búfer antes deG mando.

[jerry]$ sed -n '/Paulo/!h; /Paulo/{x;G;p}' books.txt

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

The Alchemist 
Paulo Coelho 
The Pilgrimage 
Paulo Coelho