No es necesario poner la etiqueta :afuera de la instrucción principal, tampoco se -enecesita 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 \ngenerado por Ncon un espacio ;
tava 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;
sedlee 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
tahace que el final del script sea accesible solo cuando se lee la última línea de entrada (la única línea donde sfalla), 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
pse 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 \ncambie en un espacio), Nno se puede agregar ninguna línea, sfalla, tase omite, se alcanza el final del script y pse ejecuta la instrucción rint implícita en el espacio de patrón de 1 línea looong actual .
La -iopción sustituye el archivo de entrada filecon todo el espacio de patrón de 1 línea.