Cuidado com alguns casos especiais que você pode precisar considerar aqui. Vamos pegar como exemplo 4 arquivos:
Se você quiser:
-
file1
: vazio
-
file2
: \n
-
file3
: foo\nbar\n
-
file4
: foo\nbar
(por exemplo, para que você possa reconstruir o arquivo passando a saída para printf %b
).
Então, você poderia fazer:
perl -pe 's/\n/\n/; END{print "\n" if $.}' < file
Ou com o GNU awk
:
gawk '{printf "%s", $0 (RT ? "\n" : "")}
END{if (NR) print ""}' < file
Você pode se adaptar se quiser ignorar o delimitador da última linha, se houver, ou não quiser a nova linha à direita, mas então você pode querer testar nesses 4 casos diferentes que ela faz o que você quer como você provavelmente vai achar que você precisa ter tratamentos especiais para alguns deles.
Por exemplo, o seu
< file sed '$!G' | paste -sd '\n' -
a solução para ignorar o delimitador da última linha produz uma linha vazia para file1
e file2
(e para texto não delimitado corretamente ( file4
) pode não funcionar corretamente com todos os sed
/ paste
implementations como aquelas destinadas a lidar com texto válido).
perl -pe 's/\n?$/eof ? "\n" : "\n"/e' < file
pode ser mais portável e talvez um pouco melhor para file1
e file2
, o que deixaria inalterado.