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?


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


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".


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.

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 

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"

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

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

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,

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


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".


-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


Esta resposta não traz nada de novo, does2unix já é mencionado pelo menos em duas respostas muito mais antigas.
Rui F Ribeiro
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.