Como converter a quebra de linha ^ M em quebra de linha 'normal' em um arquivo aberto no vim?


481

vim mostra em todas as linhas que terminam ^ M

Como faço para substituir isso por uma quebra de linha 'normal'?



3
Altere a solução para a alteração do formato do arquivo, porque essa é a solução mais limpa.
Erikbwork

1
Eu sei que esta pergunta é sobre o vim, mas algumas outras pesquisas no Google também aparecem nesse segmento. Portanto, se você tiver o Eclipse instalado em seu sistema, poderá converter o delimitador de linha para um único arquivo ou para uma árvore completa de arquivos com apenas alguns cliques: stackoverflow.com/a/7019737/1364747
Teddy

Eu gosto de como você chama quebras de linha normais "normais" - em contraste com aquelas ^ M quebras de linha :-)
DerMike

Respostas:



577

Comando

:%s/<Ctrl-V><Ctrl-M>/\r/g

Onde <Ctrl-V><Ctrl-M>significa digite Ctrl+ Ve Ctrl+ M.

Explicação

:%s

substituto,% = todas as linhas

<Ctrl-V><Ctrl-M>

^ M caracteres (o Ctrl-V é uma maneira do Vim de escrever o caractere Ctrl ^ e Ctrl-M grava o M após a expressão regular, resultando em ^ M caractere especial)

/\r/

com nova linha ( \r)

g

E faça isso globalmente (não apenas a primeira ocorrência na linha).


21
removeu os caracteres ^ M, mas não insere o retorno de carro.
luckytaxi

14
@jumpnett - Você precisa pressionar os acordes das teclas Ctrl-V / Ctrl-M, não inseri-los como texto literal.
LeopardSkinPillBoxHat

33
Essa é definitivamente a resposta certa para a pergunta: se você tiver um ^ M seguido de uma nova linha, desejará manter a nova linha, mas remover o ^ M. Fazendo a outra substituição abaixo, espaços duplos em seu arquivo.
dlamblin

12
Se ainda estiver faltando um retorno de carro (ou seja, o ^ M foi removido, mas tudo está envolvido em uma única linha), faça: :%s/<Ctrl-V><Ctrl-M>/\r/g(onde \ r substitui o ^ M por uma nova linha).
22815 William Turrell #

7
Se você estiver executando o Vim no Windows, precisará usar <Ctrl-Q> em vez de <Ctrl-V>.
GrandAdmiral

418

No Linux e Mac OS, os seguintes trabalhos,

:%s/^V^M/^V^M/g

onde ^V^Msignifica digite Ctrl+ Ve depois Ctrl+ M.

Nota: no Windows, você provavelmente deseja usar em ^Qvez de ^V, pois, por padrão, ^Vé mapeado para colar texto.


3
Por que isso recebeu um voto negativo? Funciona, mesmo quando o arquivo é compactado em uma linha porque possui o final da linha incorreta.
21133 Paul Tomblin

2
Não. Meu caminho substitui o que for o final da linha no arquivo pelo final da linha correto.
21139 Paul Tomblin

7
Isso ocorre para um problema diferente quando o arquivo não possui novas linhas, o que eu admito ser mais comum. FYI ^ M pode ser correspondido por \ r
dlamblin 16/10

12
Este é um comando profundamente misterioso, mas funciona para mim em um Mac.
Eric Walker

5
Descobri que o equivalente %s/\r/\r/gfuncionava bem no MacVim para um arquivo exibido apenas ^Mno final das linhas (uma longa linha em termos do MacVim). Claramente, \ r significa coisas diferentes no padrão versus peças de reposição deste comando.
RichVel 12/09

184

Dentro vim, veja o formato do arquivo - DOS ou Unix:

:set filetype=unix

:set fileformat=unix

O arquivo será gravado de volta sem caracteres de retorno de carro (CR, ^ M).


3
use: set fileformat = unix Para a maioria das configurações, o tipo de arquivo altera apenas o tipo de sintaxe que está sendo usado.
derGral,

6
Isso corrigiu o erro que eu estava tendo ... O Vim começou a pensar que meu arquivo formatado em UNIX era o Windows e as linhas recém-alteradas estavam mostrando ^ M no diff do git.
Thomas Hunter II

Deve ser dependente do sistema. Hoje, este funcionou. O comando set é feito no vim, btw.
Gbarry #

1
! grande porque o fileformat é dos, configurá-lo para ser unix, e é ok
zhaozhi

3
Isso também funciona no vi BTW, e você pode fazer set ff=unixum pequeno atalho da mesma maneira que fté um atalho parafiletype
Posva

110

Um arquivo que eu criei com o BBEdit visto no MacVim exibia vários^M retornos de linha, em vez de retornos regulares. A seguinte cadeia de caracteres substituiu resolveu o problema - espero que ajude:

:%s/\r/\r/g

É interessante porque estou substituindo quebras de linha com o mesmo caractere, mas suponho que o Vim precise apenas obter um novo \ r para exibir corretamente. Eu estaria interessado em conhecer a mecânica subjacente do porquê disso funciona.


1
Há uma tendência para as funções de pesquisa aceitarem regras mais amplas para reconhecer sequências de fim de linha. Mas \ r tem um significado específico quando está sendo escrito como dados.
Gbarry #

Isso funcionou para mim no Windows gVim para resolver um arquivo que não apresentava quebras de linha, apenas um monte de ^ M.
flash

2
De todas as soluções oferecidas nesta página, este foi o único padrão que funcionou para mim na remoção de ^ M de um arquivo csv. Usando o MacVim.
B6431

+1 trabalhou para mim também enquanto SSHing para Ubuntu Trusty a partir do Windows usando Mobaterm
Carl

Portanto, isso pareceu substituir todos os \rpersonagens, \napesar de especificar \rcomo substituto. Sem reclamar, era exatamente o que eu queria. Estranho.
rosquinha

34

Primeiro, use :set ff?para descobrir o formato do arquivo.

Eu acho que poderia ser unix, então o problema é que seu arquivo foi criado com a fileformat=dosadição de "^ M ^ J" ao final da linha, mas lida flieformat=unixapenas com a remoção do "^ J" do final da linha, deixando o "^ M" lá.

Basta digitar :e ++ff=dosna linha de comando do Vim para alterar o formato do seu arquivo de unix para dos. Deve resolver o problema. Caso contrário, :%s/\r//gdeve ajudá-lo.


3
Eu tive que fazer as duas coisas. :e ++ff=dosentão :set ff=unixe:w
Max

29

para que o caractere ^ M correspondesse, tive que selecioná-lo visualmente e depois usar o comando OS copy to clipboard para recuperá-lo. Você pode testá-lo fazendo uma pesquisa pelo caractere antes de tentar o comando replace.

/^M

deve selecionar a primeira linha incorreta

:%s/^M/\r/g

substituirá todos os ^ M errantes por retornos de carro.

Isto é como funções no MacVim, que é baseado no gvim 7.

EDITAR:

Tendo esse problema novamente na minha máquina Windows 10, que possui o Ubuntu para Windows, e acho que isso está causando problemas de formato de arquivo para o vim. Nesse caso, alterar o ff para unix, mac ou dos não fez nada além de alterar o ^ M para ^ J e vice-versa.

A solução neste caso:

:%s/\r$/ /g
:%s/ $//g

A razão pela qual segui esse caminho é porque queria garantir que não estava sendo destrutivo com meu arquivo. Eu poderia ter, :%s/\r$//gmas isso teria excluído os retornos de carro imediatamente e poderia ter tido resultados inesperados. Em vez disso, convertemos o caractere CR singular, aqui um caractere ^ M, em um espaço e, em seguida, removemos todos os espaços no final das linhas (o que para mim é um resultado desejável, independentemente)

Desculpe por reviver uma pergunta antiga que já foi respondida há muito tempo, mas parecia haver alguma confusão em andamento e pensei em ajudar a esclarecer algumas dessas questões, já que isso está surgindo nas pesquisas do Google.


1
pressionar ctrl-v ctrl-m pode funcionar para inserir o caractere, também, fwiw. mas o \ r é o que insere o retorno de carro adequado.
Metagrapher)

1
Esta é a resposta certa. Como dito acima, use <ctrl-v> <ctrl-m> para inserir o literal ^ M no comando.
Carlosayam

1
Concordo, embora tenha certeza de que, se isso tivesse funcionado para mim no momento da postagem original, não teria postado. ;)
Metagrafista

22

Nenhuma delas funcionou para mim, então eu tentei isso, que funcionou:

tipo :%s/

pressione CTRL-VCTRL-M

tipo //g

pressione Enter

Portanto, o comando geral no Vim deve parecer :%s/^M//g

O que isso faz: :%s(encontre e substitua) /^M/(esse símbolo) /(sem caracteres) g(globalmente).


Bang on !! Funciona no Mac.
shamail


15

Sem precisar usar Ctrl: :%s/\r$//


1
É assim que eu também faço. Eu só nunca me lembro do comando #
67 pixel

Esta é a maneira recomendada de remover essas terminações.
21817 Metagrapher


12

Eu fiz isso com sed:

sed -i -e 's/\r/\n/g' filename


Tem certeza de que isso funciona? No OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand

Sim, funciona (eu uso muito), mas no OSX, se você não possui a versão GNU do sed instalada, ela pode não funcionar. A versão do sed que a Apple envia por padrão é muito diferente (infelizmente) da versão GNU que é fornecida em todas as distros do Linux. Confira a resposta a esta pergunta para obter mais ajuda: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Obrigado @Liberdade_Ben. Parece que isso funciona para o GNU, sedmas não para o BSD sed(como encontrado no OSX). Qualquer um que conserte quebras de linha provavelmente está trabalhando com uma mistura de sistemas operacionais, por isso é útil esclarecer quando a resposta funcionará.
Armand #

10

Que tal apenas: :%s/\r//g Isso funcionou totalmente para mim.

O que isso faz é apenas limpar o fim da linha de todas as linhas, remover o ^ M e pronto.


9

Existem muitas outras respostas para essa pergunta, mas ainda assim, o seguinte funciona melhor para mim, pois eu precisava de uma solução de linha de comando:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Explicação:

  • Sem carregar nenhum arquivo .vimrc, abra myfile
  • Execute :e ++ff=dospara forçar uma recarga do arquivo inteiro como terminações de linha dos.
  • Execute :w ++ff=unixpara gravar o arquivo usando terminações de linha unix
  • Sair do vim

3
obrigado! este fixo meu problema e achei que seria útil para usar em scripts
Peddipaga

8

Ctrl+ Mminimiza minha janela, mas Ctrl+ Enterrealmente insere um ^Mcaractere. Eu também tinha que ter certeza de não tirar a Ctrltecla entre os pressionamentos.

Então a solução para mim foi:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Onde <Ctrl-V><Ctrl-Enter>meios para pressionar e manter pressionado Ctrl , pressione e solte V, pressione e solte Enter, e depois solte Ctrl .

Se você estiver trabalhando em um arquivo gerado pelo Windows

A solução acima adicionará uma linha adicional entre as linhas existentes, porque já existe um invisível \rapós o ^M.

Para evitar isso, você deseja excluir os ^Mcaracteres sem substituí-los.

:%s/<Ctrl-V><Ctrl-Enter>//g

Onde %significa "neste buffer", ssignifica "substituto", /significa "(encontre) o seguinte padrão", <Ctrl-V><Ctrl-Enter>refere-se às teclas a serem pressionadas para obter o ^Mcaractere (veja acima), //significa "sem nada" (ou "com o padrão" entre essas duas barras, que estão vazias ") e gé uma bandeira que significa" globalmente ", em oposição à primeira ocorrência em uma linha.


7

Isso funcionou para mim:

  1. Defina o formato do arquivo como unix ( \nfinal de linha)
  2. Salve o arquivo

Então no vim:

:set ff=unix
:w

1
Este funcionou para mim, enquanto a resposta aceita não.
Marcello Romani

7

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,

5

Como alternativa, existem utilitários de código aberto chamados dos2unix e unix2dos disponíveis que fazem exatamente isso. Em um sistema Linux, eles provavelmente são instalados por padrão; para um sistema Windows, você pode baixá-los em http://www.bastet.com/, entre outros.


5
sed s/^M//g file1.txt > file2.txt

onde ^ M é digitado pressionando simultaneamente as 3 teclas, ctrl + v + m


4

use o utilitário dos2unix se o arquivo foi criado no Windows, use o utilitário mac2unix se o arquivo foi criado no mac. :)


nunca ouvi falar do mac2unix antes, teria votado novamente se eu pudesse!
Kuf

Huray! este é o caminho a seguir!
Private



1

Para salvar as teclas digitadas , evite digitar Ctrl+ VCtrl+ Mcolocando-o em um mapeamento. Basta abrir um arquivo contendo um caractere ^ M, puxá-lo e colá-lo em uma linha como esta em seu arquivo .vimrc:

nnoremap <Leader>d :%s/^M//g<CR>

1

Nenhuma dessas sugestões funcionou para mim, tendo conseguido um monte de ^Mquebras de linha enquanto trabalhava com o vim e o eclipse. Eu suspeito que encontrei um caso externo, mas no caso de ajudar alguém que fiz.

:%s/.$//g

E resolveu o meu problema


Isso removerá QUALQUER caractere no final de uma linha. Se você tiver uma linha que, por algum motivo, não seja terminada por ^ M, removerá esse caractere também e seria inesperado. Não deve ser esse o caso, mas, no caso, e você não sabe disso, poderá manchar seu arquivo de uma maneira muito difícil de identificar.
Metagrapher

1
:g/^M/s// /g

Se você digitar ^Musando Shift+6 Caps+M, não aceitará.

Você precisa digitar ctrl+v ctrl+m.


1

^Mdá quebras de linha indesejadas. Para lidar com isso, podemos usar o sedcomando da seguinte maneira:

sed 's/\r//g'

idk por que isso foi rebaixado para -1 ... porque usa sed? você pode fazer a mesma substituição dentro vim e deve trabalhar
Metagrapher

1

Basta remover set binaryno seu .vimrc!


Em outro segmento, "definir binário" foi recomendado para se livrar da inserção automática da nova linha.
dexter2305

1

Para usar sedno MacOS, faça o seguinte:

sed -i.bak $'s/\r//' <filename>

Explicação: A $'STRING'sintaxe aqui pertence ao shell bash. Macs não tratam \rcomo caracteres especiais. Ao citar a string de comando, $''você está dizendo ao shell para substituir \ro \rcaractere real especificado no padrão ANSI-C.


0

"Esta função preserva a lista de saltos

fun! Dos2unixFunction()
let _s=@/
let l = line(".")
let c = col(".")
try
    set ff=unix
    w!
    "%s/\%x0d$//e
catch /E32:/
    echo "Sorry, the file is not saved."
endtry
let @/=_s
call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()

Nesse caso, o que há de errado em usar o comando dos2unix nativo do * NIX? linux.die.net/man/1/dos2unix
Metagrapher

0

Passei uma tarde lutando com \ n ctrl-v 012 (os quais me fornecem nulo). & trabalhei nesse tópico até chegar ao metagrafista.

\r funcionou bem para mim!

/),/s/),/)\r/g

virou algo assim:

lista negra-extra: i386 (0.4.1, 0.4.1 + nmu1), libmount1: i386 (2.20.1-5.1, 2.20.1 -5.2), libblkid1: i386 (2.20.1-5.1, 2.20.1-5.2) , libapt-pkg4.12: i386 (0.9.7.4, 0.9.7.5), nmap: i386 (6.00-0.1, 6.00-0.2), libsane-common: i386 (1.0.22-7.3,

em algo como isto:

26 libwv-1.2-4: i386 (1.2.9-3, automático)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, automático)
28 jed: i386 (0.99.19-2.1)

Magia. Sou profundamente grato

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.