O que é `^ M` e como me livrar dele?

134

Quando abro o arquivo vim, vejo ^Mcaracteres estranhos .

Infelizmente, o mecanismo de pesquisa favorito do mundo não se dá bem com caracteres especiais nas consultas, então estou perguntando aqui:

  • Qual é esse ^Mpersonagem?

  • Como poderia ter chegado lá?

  • Como faço para me livrar dele?

Christoph Wurm
fonte
3
Vlastimil que foi uma edição inútil. Got é o pretérito pretendido de get no inglês britânico.
21418 Jesse_b
1
É um dígrafo carácter de controlo, para mais informações: help digraph-table.
Eric Leschinski

Respostas:

108

O ^Mé um caractere de retorno de carro. Se você perceber isso, provavelmente está vendo um arquivo que se originou no mundo DOS / Windows, em que um final de linha é marcado por um par de retorno de carro / nova linha, enquanto no mundo Unix, final de linha é marcado por uma única nova linha.

Leia este artigo para obter mais detalhes e também a entrada da Wikipedia para nova linha .

Este artigo descreve como configurar o vim para editar arquivos de forma transparente com diferentes marcadores de fim de linha.

Se você possui um arquivo ^Mno final de algumas linhas e deseja se livrar deles, use isto no Vim:

:s/^M$//

(Pressione Ctrl+ V Ctrl+ Mpara inserir isso ^M.)

larsks
fonte
11
Tente :%s/^M/\r/gremover ^Me substituir ^Mpor caracteres de nova linha \r. Sem %, o comando se aplica somente à linha atual. E me deparei com alguns exemplos em que ^Mnão está no fim da linha, tais comoThe first line.^MThe second line.
George
Ou se você não quiser cargas de quebras de linha que você acabou poderia fazer:%s/^M/
carefulnow1
2
Se for apenas um retorno de carro, isso pode ser a quebra de linha clássica (pré-Unix) do Macintosh. Até alguns programas mais recentes, como o Excel 2007 para Mac, fazem isso por algum motivo.
Sudo
@larsks Mas altap.cz/salamander/help/salamand/appendix_txtfiles diz que ^Mé usado em UNIX
Vivek
O artigo ao qual você vinculou diz que \né usado no Unix, o que está correto. Esse é o código ASCII 10, também conhecido como ^J.
Larsks
39

A maioria dos sistemas operacionais UNIX possui um utilitário chamado dos2unixque converterá o CRLF em LF. As outras respostas abrangem a pergunta "o que são".

Aaron Brown
fonte
36

Uma maneira mais simples de fazer isso é usar o seguinte comando:

dos2unix filename

Este comando também funciona com padrões de caminho, por exemplo,

dos2unix path/name*

Se não funcionar, tente usar o modo diferente:

dos2unix -c mac filename
  • -cDefina o modo de conversão. Onde CONVMODE é um dos: ascii, 7bit, iso, maccom asciisendo o padrão.
AnonGeek
fonte
22

Isso funcionou para mim

:e ++ff=dos 

O comando: e ++ ff = dos informa ao Vim para ler o arquivo novamente, forçando o formato do arquivo dos. O Vim removerá as terminações de linha somente CRLF e LF, deixando apenas o texto de cada linha no buffer.

então

:set ff=unix 

e finalmente

:wq 
Stryker
fonte
3
obrigado! isso funcionou para mim, mas a solução aceita não
Bjorks número um fã
Será que ffse refere ao formato de arquivo? Que tal ++ff?
KcFnMi
O comando: e ++ ff = dos informa ao Vim para ler o arquivo novamente, forçando o formato do arquivo dos. O Vim removerá as terminações de linha somente CRLF e LF, deixando apenas o texto de cada linha no buffer.
Stryker
10

Outra maneira de se livrar dos retornos de carro é com o trcomando

Eu tenho um pequeno script que se parece com isso

#!/bin/sh
tmpfile=$(mktemp)
tr -d '\r' <"$1" >"$tmpfile"
mv "$tmpfile" "$1"
Johan
fonte
6

Você pode limpar isso com sed:

sed -e 's/^M$//' < infile > outfile

O truque é como inserir o retorno de carro corretamente. Geralmente, você precisa digitar C-v C-mpara inserir um retorno de carro literal. Você também pode ter um trabalho sed com

sed -i.bak -e 's/^M$//' infile
Dale Hagglund
fonte
2

O que é isso ^ M?
O ^ M é um caractere de retorno de carro. Se você perceber isso, provavelmente está vendo um arquivo que se originou no mundo DOS / Windows, em que um final de linha é marcado por um par de retorno de carro / nova linha, enquanto no mundo Unix, final de linha é marcado por uma única nova linha.

Como poderia ter chegado lá?
Quando houver alteração no formato do arquivo.

Como faço para me livrar dele?
abra seu arquivo com

vim -b FILE_PATH

salve-o com o seguinte comando

:%s/^M//g
Prashant Kanse
fonte
Você tem um erro de digitação no seu filr .
Mateusz Piotrowski 27/01
4
Esta resposta não adiciona nada às outras respostas. O primeiro parágrafo é uma cópia quase literal da resposta aceita. O código fornecido não salva nada, mas apenas remove todos os caracteres de retorno de carro de todas as linhas. E não tenho certeza de como a abertura do arquivo no modo binário ajudará aqui.
Dubu
2

No meu caso,

Nada acima funcionou, eu tinha um arquivo CSV copiado para a máquina Linux do meu mac e usei todos os comandos acima, mas nada ajudou, exceto o abaixo

tr "\015" "\n" < inputfile > outputfile

Eu tinha um arquivo no qual ^ M caracteres eram entrelaçados entre linhas, algo como abaixo

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,
Vishwanath gowda k
fonte
0

Você pode usar o Vim no modo Ex:

ex -bsc '%s/\r//|x' file
  1. -b modo binário

  2. % selecione todas as linhas

  3. s substituto

  4. \r retorno de carro

  5. x salvar e fechar

Steven Penny
fonte
0

Adicione a seguinte linha ao seu ~ / .vimrc

command! Tounix :call Preserve('1,$s/^M//')

Então, quando você tiver um arquivo com as terminações de linha do Windows, execute o comando ": Tounix".

Charlie Dalsass
fonte
-1

No passado, eu vi que mesmo os arquivos de configuração não são analisados ​​corretamente e reclamam de espaço em branco, mas se você vi e faz uma lista definida, ele não mostrará o espaço em branco, o nome do arquivo grep [[space]] mostrará ^ M

é dos2unix fileaí que ajuda

Sriram
fonte
Esta resposta não traz nada de novo, does2unix já é mencionado pelo menos em duas respostas muito mais antigas.
Rui F Ribeiro