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,
- Sed lee una línea y la coloca en el búfer de patrones.
- 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.
- 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,
- La primera línea se colocará en el espacio de espera tal como está.
- 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).
- Ahora la primera y la segunda línea se invirtieron y muévala al espacio de espera.
- Repita los pasos anteriores hasta la última línea.
- 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,
- Hasta que llegue la línea vacía, siga agregando las líneas que no están vacías en el espacio de espera
- 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,
- Para cada ciclo, coloque la línea en el búfer de espera, si no coincide con el patrón "Mysql".
- 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.
- 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,
- 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.
- 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í.
- 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,
- Coloque la primera línea en el búfer de espera.
- Cuando llegue la segunda línea, agregue al espacio en espera (primera línea)
- 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.
- Así que intercambie las líneas en el espacio del patrón.
- 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,
- 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.
- 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.