El comando H (Hold space) le añade a la zona auxiliar un carácter nueva línea (\n) y a continuación añade el contenido de la zona de trabajo.
Usando este comando, vamos a ver cómo podemos poner todo el contenido del flujo de entrada en una sola línea, separando las líneas con un espacio:
$ sed -n 'H ; ${g ; s/\n/ /g ; p}' f
uno dos tres
Lo que se ha hecho es lo siguiente:
- Desactivamos el autoprint. (-n)
- Vamos acumulando todas las líneas en la zona auxiliar. La separación entre ellas es el carácter \n. (H)
- Solo para la última línea hacemos también lo siguiente: (${ ... })
- Recuperamos la zona auxiliar, que en este momento, contiene todas las líneas del flujo de entrada separadas por \n. (g)
- Sustituimos el carácter \n por un espacio y nos quedará una única línea. (s/\n/ /g)
- Visualizamos la zona de trabajo. (p)
- Recuperamos la zona auxiliar, que en este momento, contiene todas las líneas del flujo de entrada separadas por \n. (g)
En este caso el comando s lo podemos sustituir por el comando y:
$ sed -n 'H ; ${g; y/\n/ / ; p}' f
uno dos tres
Como vemos, hay un espacio al inicio, eso es debido a la forma de trabajar del comando H, que escribe, en la zona auxiliar, primero un \n y luego el contenido de la zona de trabajo, por lo que al inicio de la zona auxiliar tendremos un \n, que luego se convierte en un espacio. Podríamos eliminarlo si queremos, para ello tendríamos que evitar el primer \n, y lo podemos hacer usando el comando h para la primera línea y el H para el resto:
$ sed -n '1h ; 2,$H ; ${g; s/\n/ /g ; p}' f
uno dos tres
$ sed -n '1h ; 2,$H ; ${g; y/\n/ / ; p}' f
uno dos tres