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.