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