Se você tiver Perl, usar essa é a maneira mais fácil de contornar versões diferentes de sed
etc.
perl -pe 's/\r?$/\r/' < infile > outfile
Ou no local:
perl -i.bak -pe 's/\r?$/\r/' infile
Isso adicionará um retorno de carro ao final de todas as linhas, exceto as que já possuem um. (Ou, na verdade, substitua zero ou um CR: s por um CR.)
Teste:
$ cat -e infile
with cr^M$
no cr$
still no cr$
$ perl -pe 's/\r?$/\r/' < infile |cat -e
with cr^M$
no cr^M$
still no cr^M$
$ perl --version
This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
[...]
Acho que vi uma menção ao macOS em algum lugar. Se é isso que você está usando, o problema é que o sed
que vem com ele não suporta metade das coisas que o GNU sed suporta. Aquele no meu Mac parece não suportar \r
ou \xHH
...
Mas você pode inserir um retorno de carro literal na linha de comando:
sed -Ee 's/^M?$/^M/' < infile > outfile
O ^M
não tem os dois caracteres ^
e M
, mas o retorno de carro único, que o shell (suponho que você terá Bash) é exibido como ^M
. Você precisa digitar o caractere com Ctrl-V Ctrl-M
Ou, alternativamente, o shell interpretará o \r
para você:
sed -Ee $'s/\r?$/\r/' < infile > outfile
(A sintaxe $'...'
é suportada por quase todos os shells, mesmo que não seja padrão (pelo que eu entendi))