Como parte de nuestra serie de tutoriales UNIX sed en curso anterior, cubrimos la impresión, eliminación, sustitución, escritura de archivos, comandos de manipulación de archivos, etc., con una sola línea en el espacio del patrón.
En este artículo, revisemos cómo hacer la operación multilínea en Sed.
¿Recuerdas la metodología de trabajo de Sed que aprendimos en nuestro primer tutorial de sed?. En ese artículo, explicamos que Sed lee línea por línea, elimina cualquier línea nueva final, coloca una línea en un búfer de espacio de patrón, procesa según los comandos dados e imprime el espacio de patrón.
En caso de que desee eliminar todas las nuevas líneas en un archivo, no puede usar el siguiente método. Porque la nueva línea ya se eliminó y se colocó en el espacio del patrón.
$ sed 's/\n//' filename or $sed 's/\n/ENDOFLINE\n/' filename
Para situaciones como esta, sed multilínea es apropiado. Sed proporciona el comando "N" para operaciones de varias líneas.
El comando N lee la siguiente línea de la entrada, agrega la siguiente línea al espacio del patrón. La siguiente línea está separada del espacio del patrón original por un carácter de nueva línea.
Primero creemos el archivo geekstuff.txt que se usará en todos los ejemplos mencionados a continuación.
$ cat thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Website Design Windows- Sysadmin, reboot etc. $
Ejemplo Sed 1. Unir dos líneas consecutivas
$ sed -e '{ N s/\n/ @ / }' thegeekstuff.txt Linux Sysadmin @ Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. @ Security (Firewall, Network, Online Security etc) @ Storage in Linux @ Website Design Website Design @ Windows- Sysadmin, reboot etc.
En el ejemplo anterior,
- Las llaves "{" y "}" utilizadas para agrupar los comandos. Las llaves y los comandos sed deben estar en líneas separadas.
- Sed lee la primera línea y la coloca en el espacio del patrón, el comando N lee la siguiente línea y la agrega con el espacio del patrón, es decir, la primera línea separada por una nueva línea. Así que ahora el espacio de patrón tendrá primera línea\nsegunda línea.
- Siguiente sustitución de \n a space@space e imprime el contenido del espacio del patrón como su comportamiento predeterminado de sed. Entonces las líneas consecutivas están unidas y delimitadas por ” @ “
Sed Ejemplo 2. Numere cada línea que no esté en blanco de un archivo
Como se mencionó en nuestro artículo anterior, =es un comando para obtener el número de línea de un archivo.
$ sed '/./=' thegeekstuff.txt | sed 'N; s/\n/ /' 1 Linux Sysadmin 2 Databases - Oracle, mySQL etc. 3 Databases - Oracle, mySQL etc. 4 Security (Firewall, Network, Online Security etc) 7 Storage in Linux 8 Website Design 9 Website Design 10 Windows- Sysadmin, reboot etc.
- El primer comando sed imprime el número de línea e imprime la línea original en una línea siguiente si no está en blanco. (Ejecutarlo y ver el resultado del primer comando sed).
- El siguiente comando sed solo agrega un par de líneas.
Ejemplo 3 de Sed. Eliminar dos líneas en blanco consecutivas de la entrada
$ sed '/^$/{ N /^\n$/d }' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Website Design Windows- Sysadmin, reboot etc.
Si la línea está en blanco, lea y agregue la siguiente línea, /^\n$/ representa, dos líneas están vacías,\n se agrega mediante el comando N. Luego simplemente elimine el espacio del patrón y comience el próximo ciclo usando el comando 'd'.
Ejemplo de Sed 4. Eliminar las últimas 2 líneas de un archivo
Antes de ver este ejemplo, debe conocer dos comandos sed interesantes.
- P:que imprime la primera línea de un espacio de patrón. (hasta el primero \n).
- D:elimina la primera línea del espacio del patrón. Luego, el control pasa a la parte superior del script.
$ sed 'N;$!P;$!D;$d' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design
- Lee la primera línea y la coloca en el espacio del patrón. El comando
- N lee la línea siguiente y la agrega al espacio del patrón separado por una nueva línea. (Ahora primera línea\nsegunda línea)
- Si no llega a la última línea ($), imprima la primera línea y elimine la primera línea sola del espacio del patrón. Entonces el ciclo comienza de nuevo.
- Así se une a la 2.ª\n3.ª línea, a la 3.ª\n4.ª línea y continúa.
- Por último, cuando tiene la línea 9\n10 en un espacio de patrón, llega a $, por lo que simplemente elimina el espacio de patrón. ($!P y $!D no se imprimirán ni eliminarán si es $).
Ejemplo Sed 5. Imprimir las últimas 2 líneas de un archivo
$ sed '$!N;$!D' thegeekstuff.txt Website Design Windows- Sysadmin, reboot etc.
Lo anterior une y elimina cada línea hasta que las últimas dos líneas están en el espacio del patrón. Cuando llega a $, imprime el espacio del patrón que tendrá solo las dos últimas líneas.
Ejemplo de Sed 6. Eliminar líneas consecutivas duplicadas de un archivo
El siguiente comando verifica cada línea unida con la siguiente línea, verifica si ambas son iguales, entonces no imprime el espacio del patrón (! P), simplemente elimina la primera línea del espacio del patrón. Así que solo quedará una línea en el espacio del patrón.
$ sed '$!N; /^\(.*\)\n\1$/!P; D' thegeekstuff.txt Linux Sysadmin Databases - Oracle, mySQL etc. Security (Firewall, Network, Online Security etc) Storage in Linux Website Design Windows- Sysadmin, reboot etc.