Alterando os finais de linha de um arquivo unix para o windows ^ M não está funcionando

1

Eu tenho um arquivo que está usando a notação unix para fins de linha e outro que está usando a notação do Windows.

Quando eu vi do arquivo unix, não vejo nada no final da linha. Quando eu vi o arquivo do windows eu vejo ^M em azul

Oproblemaéque,domeioparabaixo,aslinhasnãocontêm^Memazul(??).

Estoutentandoconverteroarquivointeiroparater^Memtodasaslinhas.

Eutenteimuitoscomandos,masesteemparticular

sed-e's/$/^M/'<input.txt>output.txt

adicione"^ M" como dois caracteres, não como Command-M e isso também nas linhas que já possuem o caractere ^M correto ...

Eu também tentei

sed -e 's/\r/^M/' < input.txt > output.txt

e

sed -e 's/\n/^M/' < input.txt > output.txt

sem sucesso ...

emitindo um cat -e input.txt Eu vejo isso nas ^ M linhas corretas:

1895;2;3;5;10;14;34^M$
1896;3;6;14;15;21;25^M$
1897;9;22;25;47;52;58^M$
1898;12;34;45;53;55;58^M$

e isso nos incorretos

1899;20;23;35;36;44;48$
1900;8;11;27;28;43;46$
1901;11;12;26;30;37;53$
1902;02;07;09;18;21;25$
1903;09;10;15;28;43;45$

Como obtenho todas as linhas com o comando-m?

    
por SpaceDog 02.12.2017 / 13:59

2 respostas

4

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))

    
por 02.12.2017 / 14:13
0

unix2dos deve funcionar para você neste caso. No entanto, parece que você está usando o macOS, que não tem repositório para esse programa, sugiro sed -e 's/\n/\r\n/' < input.txt > output.txt , que é apenas um pouco menos conveniente.

    
por 02.12.2017 / 14:11

Tags