GNU/Linux >> Tutoriales Linux >  >> Linux

Tutorial de Unix Sed:7 ejemplos de operaciones Sed Hold y Pattern Buffer

Este artículo es parte de la serie actual de Consejos y trucos de Unix Sed.

En nuestros artículos anteriores de sed, aprendimos:impresión de sed, eliminación de sed, sustitución de sed, escritura de archivos de sed, comandos múltiples de sed, operación de varias líneas de sed y manipulación de líneas de archivos de sed.

En nuestra primera parte del tutorial sed, aprendimos que sed tiene dos búfer:búfer de patrón sed y búfer de retención sed . Hasta ahora solo hemos hablado del búfer de patrones.

En este artículo, repasemos cómo usar la retención de sed y el búfer de patrón usando 7 ejemplos prácticos de sed .

Como su nombre lo indica, sed hold buffer se utiliza para guardar todo o parte del espacio del patrón sed para su posterior recuperación. El contenido del espacio del patrón se puede copiar al espacio de espera y luego de vuelta. No se realizan operaciones directamente en el espacio de espera. sed proporciona un conjunto de funciones de retención y obtención para manejar estos movimientos.

Función sed h

La función h (mantener) copia el contenido del espacio del patrón en un área de espera (también llamada espacio de espera sed). ), destruyendo cualquier contenido anterior del área de espera.

Función Sed H

La función H agrega el contenido del espacio del patrón al contenido del área de espera. El contenido anterior y el nuevo están separados por una nueva línea.

Función seg g

La función g copia el contenido del área de espera en el espacio del patrón, destruyendo el contenido anterior del espacio del patrón.

Función Sed G

La función G agrega el contenido del área de espera al contenido del espacio del patrón. El contenido anterior y el nuevo están separados por una nueva línea. El número máximo de direcciones es dos.

Función Sed x

La función de intercambio intercambia los contenidos del espacio patrón y el área de espera. El número máximo de direcciones es dos.

Ahora veamos algunos ejemplos para aprender sobre los comandos anteriores.

Primero creemos el archivo geekstuff.txt que se usará en los ejemplos que se mencionan a continuación.

$ cat thegeekstuff.txt
#Linux
        Administration
        Scripting
        Tips and Tricks

#Windows
        Administration

#Database
        Mysql
        Oracle
        Queries
        Procedures

1. Doble espacio en el contenido de un archivo usando el comando Sed

$sed 'G' thegeekstuff.txt
#Linux

        Administration

        Scripting

        Tips and Tricks

#Windows

        Administration

#Database

        Mysql

        Oracle

        Queries

        Procedures 

$

En este ejemplo,

  1. Sed lee una línea y la coloca en el búfer de patrones.
  2. El comando G agrega el búfer de retención al búfer de patrones separados por \n. por lo que se agregará una nueva línea con el contenido del espacio del patrón.
  3. Del mismo modo, si desea triplicar el espacio de un archivo, agregue dos veces el contenido del búfer de espera al búfer de patrón. (G;G)

2. Imprima el contenido del archivo en orden inverso usando el comando Sed

Imprime las líneas de un archivo en orden inverso (similar al comando tac que discutimos anteriormente).

$sed -n '1!G;h;$p' thegeekstuff.txt
        Procedures
        Queries
        Oracle
        Mysql
#Database

        Administration
#Windows

        Tips and Tricks
        Scripting
        Administration
#Linux

En este ejemplo,

  1. La primera línea se colocará en el espacio de espera tal como está.
  2. Desde la segunda línea en adelante, simplemente agregue el contenido del espacio de espera con el espacio del patrón. (Recuerde que la segunda línea está en el espacio patrón y la primera línea está en el espacio de espera).
  3. Ahora la primera y la segunda línea se invirtieron y muévala al espacio de espera.
  4. Repita los pasos anteriores hasta la última línea.
  5. Una vez que llegue a la última línea, simplemente agregue el contenido del espacio de retención con el espacio del patrón e imprima el espacio del patrón.

3. Imprima un párrafo (solo si contiene un patrón dado) usando el comando Sed

En thegeekstuff.txt imprima el párrafo solo si contiene el patrón "Administración".

$ sed -e '/./{H;$!d;}' -e 'x;/Administration/!d' thegeekstuff.txt 

Linux
        Administration
        Scripting
        Tips and Tricks

Windows
        Administration

En este ejemplo,

  1. Hasta que llegue la línea vacía, siga agregando las líneas que no están vacías en el espacio de espera
  2. Cuando aparece una línea vacía, es decir, termina un párrafo, intercambie los datos entre el patrón y el espacio de espera. De modo que todo el párrafo estará disponible en el espacio del patrón.
    Compruebe si el patrón "Administración" está disponible, si es así, no lo elimine, es decir, imprima el espacio del patrón

4. Imprima la línea inmediatamente antes de una coincidencia de patrón usando Sed Command

Imprime solo la línea inmediatamente anterior, el patrón “Mysql”.

$ sed -n '/Mysql/{g;1!p;};h' thegeekstuff.txt
#Database

En este ejemplo,

  1. Para cada ciclo, coloque la línea en el búfer de espera, si no coincide con el patrón "Mysql".
  2. Si la línea coincide con el patrón, obtenga los datos del espacio de espera (línea anterior) usando el comando g e imprímalos.
  3. En caso de que la primera línea coincida con el patrón "Mysql", el espacio de retención estará vacío. (No hay una línea anterior a la primera línea). Por lo tanto, la primera línea no debería imprimirse (1!p)

5. Elimine la última línea de cada párrafo usando el Comando Sed

$ sed -n -e '/^$/{x;d}' -e '/./x;p' thegeekstuff.txt 

#Linux
        Administration
        Scripting

#Windows

#Database
        Mysql
        Oracle
        Queries

En este ejemplo,

  1. Si la línea no está vacía, intercambie la línea entre el patrón y el espacio de espera. Entonces, la primera línea se colocará en el espacio de espera.
  2. Cuando llegue la siguiente línea que no esté vacía, intercambie el espacio del patrón y mantenga el espacio, e imprima el espacio del patrón. es decir, se imprimirá la primera línea que no esté vacía y la segunda línea quedará en espera. Y en el siguiente ciclo, la segunda línea no vacía se imprime cuando la tercera línea se detiene y continúa así.
  3. Cuando llegue una línea vacía (la línea anterior a la línea vacía estará disponible en el búfer de retención), simplemente intercambie el patrón y mantenga el espacio, y elimine la línea (última línea del párrafo) y comience el siguiente ciclo.

6. Para cada línea, agregue la línea anterior al final usando el Comando Sed

$ sed 'H;x;s/^\(.*\)\n\(.*\)/\2\1/' thegeekstuff.txt
#Linux
        Administration#Linux
        Scripting        Administration
        Tips and Tricks        Scripting
        Tips and Tricks
#Windows
        Administration#Windows
        Administration
#Database
        Mysql#Database
        Oracle        Mysql
        Queries Oracle
        Procedures                      Queries

En este ejemplo,

  1. Coloque la primera línea en el búfer de espera.
  2. Cuando llegue la segunda línea, agregue al espacio en espera (primera línea)
  3. Luego intercambie el patrón y retenga el búfer. Así que ahora el espacio de patrón tendrá la primera y la segunda línea separadas por \n, el espacio de espera tendrá solo la segunda línea.
  4. Así que intercambie las líneas en el espacio del patrón.
  5. Los pasos anteriores suceden hasta el final del archivo

7. Anteponga la etiqueta de cada bloque a cada línea de ese bloque

$ sed '
/^#/{
h
d
}
G
s/^\(.*\)\n#\(.*\)/\2 \1/' thegeekstuff.txt
Linux         Administration
Linux         Scripting
Linux         Tips and Tricks
Linux
Windows         Administration
Windows
Database         Mysql
Database        Oracle
Database        Queries
Database        Procedures

En este ejemplo,

  1. Cuando se cumple la primera línea de un bloque (que comienza con #)
    • mantenga esa línea en el espacio de retención a través del comando `h’
    • Luego borre usando 'd' para comenzar otro ciclo.
  2. Para el resto de las líneas de un bloque, el Comando 'G' agrega la línea de la etiqueta del Espacio en espera y el comando de sustitución intercambia la etiqueta y las líneas correctamente.

Linux
  1. Bash For Loop Guía y ejemplos

  2. Tutorial de Linux ln Command para principiantes (5 ejemplos)

  3. Tutorial de comandos Linux nl para principiantes (7 ejemplos)

  4. Ejemplos de ciclos for y while de Bash

  5. El concepto de 'Espacio de espera' y 'Espacio de patrón' en sed

Tutorial de Unix Sed:Impresión de líneas de archivos usando direcciones y patrones

Tutorial de Unix Sed:eliminar líneas de archivos usando direcciones y patrones

Tutorial de Unix Sed:ejemplos avanzados de sustitución de Sed

Tutorial de Unix Sed:anexar, insertar, reemplazar y contar líneas de archivos

Tutorial de Unix Sed:6 ejemplos para la operación de bifurcación de Sed

Tutorial de Unix Sed:operación de archivos de varias líneas con 6 ejemplos prácticos