Como remover todos os CRLF no arquivo (não substituir por LF)

2

Gostaria de remover todos os retornos de carro seguidos pelos feeds de linha (CRLF), como \r\n em um arquivo. Como eu posso fazer isso? Eu não posso usar dos2unix porque isso substitui CRLF por LF. E não posso usar tr , porque isso também substituirá qualquer \n que não seja precedido por \r . Como posso fazer isso?

    
por user779159 17.01.2015 / 15:39

2 respostas

6
sed ":a;/\r$/{N;s/\r\n//;b a}"

Isso corresponderá a todas as linhas que tiverem '\r' no final (seguidas por '\n' ). Nessas linhas, ele primeiro anexará a próxima linha de entrada (enquanto coloca o separador '\n entre), substituirá o "\r\n" resultante por uma string vazia e voltará ao início para ver se o novo conteúdo de espaço padrão não acontece por acaso coincidir novamente.

Após o comentário: se você quiser extrair qualquer '\r' adicional do arquivo, basta adicioná-lo após remover os combos CRLF:

sed ":a;/\r$/{$!N;s/\r\n//;t a};s/\r//g"
    
por 17.01.2015 / 15:59
1

Eu costumo alcançar perl one-liners ao fazer qualquer coisa que envolva a manipulação de finais de linha:

perl -pe 'BEGIN {undef $/} s/\r\n//g' *.txt

A chave para fazer isso funcionar é o undef $/ , que faz o Perl ler cada arquivo como uma string, na qual você pode fazer uma pesquisa e substituição. Para remover também \r , apenas ajuste o regex:

perl -pe 'BEGIN {undef $/} s/\r\n?//g' *.txt
    
por 17.01.2015 / 17:09