No es necesario poner la etiqueta :a
fuera de la instrucción principal, tampoco se -e
necesita la opción necesaria; finalmente, el /$/
es superfluo (cada línea tiene un carácter EOL).
Mejorando otras respuestas, uno obtiene
sed -i ':a; N; s/\n/ /; ta' file
Lo cual es más claro si se escribe de la siguiente manera,
sed -i ':a
N
s/\n/ /
ta' file
El comando funciona de la siguiente manera:
N
agrega la siguiente línea al espacio de patrón (multilínea), que ya contiene la línea actual;
s/\n/ /
sustituya el carácter de nueva línea \n
generado por N
con un espacio
;
ta
va a la línea del script que sigue a la etiqueta :a
, siempre y cuando la sustitución en el paso 2 haya sido exitosa , es decir , si la sustitución se produjo, la ejecución salta al paso 1 sin "presionar" el final del script, es decir , sin leer otra línea de entrada.
Tenga en cuenta lo siguiente;
sed
lee las líneas del archivo de entrada una por una en orden, comenzando desde la primera línea ;
:a
es solo una etiqueta, no un comando a ejecutar;
N
es, en principio, ejecutado en cualquier línea, pero
s/\n/ /
(en principio ejecutado en cualquier línea) tiene éxito en cualquier línea que no sea la última , entonces
ta
hace que el final del script sea accesible solo cuando se lee la última línea de entrada (la única línea donde s
falla), por lo que
- no se lee más línea de entrada en el espacio del patrón después de que se lee la primera , a menos que se lea la última , pero no hay más línea para leer y
p
se ejecuta el comando implícito .
Entonces, el script básicamente lee en la primera línea de entrada y sigue agregando las siguientes líneas una por una, sustituyendo cada vez la nueva línea con un espacio; después de que se agregue la última línea (y se \n
cambie en un espacio), N
no se puede agregar ninguna línea, s
falla, ta
se omite, se alcanza el final del script y p
se ejecuta la instrucción rint implícita en el espacio de patrón de 1 línea looong actual .
La -i
opción sustituye el archivo de entrada file
con todo el espacio de patrón de 1 línea.