Não há necessidade de colocar o rótulo :a fora da instrução principal, nem a opção -e é necessária; finalmente, o /$/ é supérfluo (cada linha tem um caractere EOL).
Melhorando outras respostas, obtém-se
sed -i ':a; N; s/\n/ /; ta' file
Qual é mais claro se escrito da seguinte forma,
sed -i ':a
N
s/\n/ /
ta' file
O comando funciona da seguinte forma:
-
N acrescenta a próxima linha ao espaço padrão (multilinha), que já contém a linha atual;
-
s/\n/ / substitui o caractere de nova linha \n gerado por N por um espaço ;
-
se a substituição foi bem sucedida vá para a linha de script seguindo o rótulo
:a (que é relativo ao script, não ao arquivo a ser editado!), ie go para o passo 1, sem ler outra linha de entrada.
Observe o seguinte:
-
sed lê as linhas do arquivo de entrada uma a uma em ordem, iniciando na primeira 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, mas a última , então
-
ta torna o fim do script acessível somente quando a última linha de entrada é lida (a única linha em que s falha), então
- nenhuma outra linha de entrada é lida depois que a 1ª é lida, a menos que a última seja lida;
Assim, o script basicamente lê na 1a linha de entrada e continua anexando as linhas seguintes uma por uma, cada vez substituindo a nova linha por um espaço; depois que a última linha for anexada (e \n foi alterado em um espaço), N não poderá acrescentar nenhuma linha, s falhará, ta será ignorado, o final do script é atingido, e a declaração implícita p rint é executada no espaço de padrão atual de uma linha do looong.
A opção -i substitui o arquivo de entrada file pelo espaço padrão de 1 linha inteiro.