Não há necessidade de colocar o rótulo :afora da instrução principal, nem a -eopção necessária; finalmente, /$/é supérfluo (toda linha tem um caractere EOL).
Melhorando outras respostas, obtém-se
sed -i ':a; N; s/\n/ /; ta' file
O que é mais claro se escrito da seguinte maneira,
sed -i ':a
N
s/\n/ /
ta' file
O comando funciona da seguinte maneira:
N anexa a próxima linha ao espaço do padrão (multilinha), que já contém a linha atual;
s/\n/ /substitua o caractere de nova linha \ngerado por Ncom um espaço ;
tavai para a linha de script após o rótulo :a , desde que a substituição na etapa 2 tenha sido bem-sucedida , ou seja , se a substituição ocorreu, a execução salta para a etapa 1 sem "atingir" o final do script, ou seja , sem ler outra linha de entrada.
Observe o seguinte;
sedlê as linhas do arquivo de entrada uma por uma em ordem, começando na 1ª linha ;
:a é apenas um rótulo, não um comando a ser executado;
N é, em princípio, executado em qualquer linha, mas
s/\n/ /(em princípio executado em qualquer linha) é bem - sucedido em qualquer linha, exceto a última , portanto
tatorna o final do script acessível somente quando a última linha de entrada é lida (a única linha em que sfalha);
- nenhuma linha de entrada adicional é lida no espaço do padrão depois que a 1ª é lida nele, a menos que a última seja lida, mas não há mais linha a ser lida e o
pcomando implícito é executado.
Portanto, o script basicamente lê a 1ª linha de entrada e continua anexando as seguintes linhas, uma a uma, sempre substituindo a nova linha por um espaço; depois que a última linha é anexada (e \nalterada em um espaço), Nnão é possível anexar nenhuma linha, sfalha, taé ignorada, o final do script é atingido e a pinstrução rint implícita é executada no espaço padrão atual de 1 linha mais longo .
A -iopção substitui o arquivo de entrada filecom todo o espaço padrão de 1 linha.