Como Remover CTRL-M (^M) de arquivos
Dica publicada em Linux / Avançado
Como Remover CTRL-M (^M) de arquivos
Opa! Esse problema geralmente ocorre quando se edita um arquivo no Windows e se passa para o Linux depois, com isso dependendo do editor usado e também no que está sendo aberto o arquivo no Linux, com isso teremos alguns "lixos" no fim de cada linha, o que pode ou não causar problemas, como visto há muitas variáveis...
Por isso, é uma dica rápida e fácil de ver isso e como corrigir.
cat -v lista1.txt |head -n3
xxxx@1111^M
YYY@22222^M
ZZZ@333^M
E esse "^M" em cada linha causa um problema (mas depende do que e aonde será usado como já informado), no meu caso, de um script com for, gerou problema.
O arquivo foi transferido entre sistemas de diferentes tipos com diferentes convenções de nova linha. Por exemplo, editores de texto baseados em Windows terão um caractere especial de retorno de carro (CR+LF) no final das linhas para indicar um retorno de linha ou nova linha, que será exibido incorretamente no Linux (^M). Isso pode ser difícil de detectar, pois alguns aplicativos ou programas podem manipular corretamente os caracteres de nova linha estrangeiros, enquanto outros não. Assim, alguns serviços podem falhar ou não responder corretamente. Muitas vezes, isso ocorre porque o arquivo é criado ou talvez até editado em uma máquina Microsoft Windows e depois carregado ou transferido para um servidor Linux. Isso normalmente ocorre quando um arquivo é transferido do MS-DOS (ou MS-Windows) sem ASCII ou modo de texto.
dos2unix filename
Via Sed:
Novo arquivo final:
sed -e "s/ //g" file > newfile
Ou aplicando no arquivo original (no quente):
sed -i "s/ //g" file
Via Perl:
perl -p -e 's/ //g' file > newfile
Era isso então, até mais.
Fonte: How to remove CTRL-M (^M) characters from a file in Linux
Por isso, é uma dica rápida e fácil de ver isso e como corrigir.
Ver o problema de fato
Aqui temos um arquivo que foi editado no Windows e depois seria usado para um pequeno script com for, aonde o problema aparece. Para vermos o "problema", podemos usar o "cat" com a parâmetro "-v", vicando assim:cat -v lista1.txt |head -n3
xxxx@1111^M
YYY@22222^M
ZZZ@333^M
E esse "^M" em cada linha causa um problema (mas depende do que e aonde será usado como já informado), no meu caso, de um script com for, gerou problema.
Explicação
File has been transferred between systems of different types with different newline conventions. For example, Windows-based text editors will have a special carriage return character (CR+LF) at the end of lines to denote a line return or newline, which will be displayed incorrectly in Linux (^M). This can be difficult to spot, as some applications or programs may handle the foreign newline characters properly while others do not. Thus some services may crash or not respond correctly. Often times, this is because the file is created or perhaps even edited on a Microsoft Windows machine and then uploaded or transferred to a Linux server. This typically occurs when a file is transferred from MS-DOS (or MS-Windows) without ASCII or text mode.
O arquivo foi transferido entre sistemas de diferentes tipos com diferentes convenções de nova linha. Por exemplo, editores de texto baseados em Windows terão um caractere especial de retorno de carro (CR+LF) no final das linhas para indicar um retorno de linha ou nova linha, que será exibido incorretamente no Linux (^M). Isso pode ser difícil de detectar, pois alguns aplicativos ou programas podem manipular corretamente os caracteres de nova linha estrangeiros, enquanto outros não. Assim, alguns serviços podem falhar ou não responder corretamente. Muitas vezes, isso ocorre porque o arquivo é criado ou talvez até editado em uma máquina Microsoft Windows e depois carregado ou transferido para um servidor Linux. Isso normalmente ocorre quando um arquivo é transferido do MS-DOS (ou MS-Windows) sem ASCII ou modo de texto.
Para correção há várias formas
Via software dos2unix:dos2unix filename
Via Sed:
Novo arquivo final:
sed -e "s/ //g" file > newfile
Ou aplicando no arquivo original (no quente):
sed -i "s/ //g" file
Via Perl:
perl -p -e 's/ //g' file > newfile
Era isso então, até mais.
Fonte: How to remove CTRL-M (^M) characters from a file in Linux
:%s/^M//g
O "^M" no VIM pode ser gerado com a combinação das teclas: Ctrl v Ctrl m