Não há necessidade de colocar o rótulo :a
fora da instrução principal, nem a -e
opçã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 \n
gerado por N
com um espaço
;
ta
vai 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;
sed
lê 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
ta
torna o final do script acessível somente quando a última linha de entrada é lida (a única linha em que s
falha);
- 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
p
comando 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 \n
alterada em um espaço), N
não é possível anexar nenhuma linha, s
falha, ta
é ignorada, o final do script é atingido e a p
instrução rint implícita é executada no espaço padrão atual de 1 linha mais longo .
A -i
opção substitui o arquivo de entrada file
com todo o espaço padrão de 1 linha.