vim mostra em todas as linhas que terminam ^ M
Como faço para substituir isso por uma quebra de linha 'normal'?
vim mostra em todas as linhas que terminam ^ M
Como faço para substituir isso por uma quebra de linha 'normal'?
Respostas:
Esta é a única coisa que funcionou para mim:
: e ++ ff = dos
Encontrado em: http://vim.wikia.com/wiki/File_format
:e ++ff=dos
seguido por :set ff=unix
irá converter as terminações em um formato saudável.
:%s/<Ctrl-V><Ctrl-M>/\r/g
Onde <Ctrl-V><Ctrl-M>
significa digite Ctrl+ Ve Ctrl+ M.
:%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).
:%s/<Ctrl-V><Ctrl-M>/\r/g
(onde \ r substitui o ^ M por uma nova linha).
No Linux e Mac OS, os seguintes trabalhos,
:%s/^V^M/^V^M/g
onde ^V^M
significa digite Ctrl+ Ve depois Ctrl+ M.
Nota: no Windows, você provavelmente deseja usar em ^Q
vez de ^V
, pois, por padrão, ^V
é mapeado para colar texto.
%s/\r/\r/g
funcionava bem no MacVim para um arquivo exibido apenas ^M
no 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.
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).
set ff=unix
um pequeno atalho da mesma maneira que ft
é um atalho parafiletype
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.
\r
personagens, \n
apesar de especificar \r
como substituto. Sem reclamar, era exatamente o que eu queria. Estranho.
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=dos
adição de "^ M ^ J" ao final da linha, mas lida flieformat=unix
apenas com a remoção do "^ J" do final da linha, deixando o "^ M" lá.
Basta digitar :e ++ff=dos
na 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//g
deve ajudá-lo.
:e ++ff=dos
então :set ff=unix
e:w
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$//g
mas 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.
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).
^ M é recuperado por Ctrl+ Ve M, também
s/^M//g
Sem precisar usar Ctrl:
:%s/\r$//
Coisa simples que funcionou para mim
dos2unix filename
Eu fiz isso com sed:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'
->oven and oven
sed
mas 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á.
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.
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:
myfile
:e ++ff=dos
para forçar uma recarga do arquivo inteiro como terminações de linha dos.:w ++ff=unix
para gravar o arquivo usando terminações de linha unixCtrl+ Mminimiza minha janela, mas Ctrl+ Enterrealmente insere um ^M
caractere. 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 .
A solução acima adicionará uma linha adicional entre as linhas existentes, porque já existe um invisível \r
após o ^M
.
Para evitar isso, você deseja excluir os ^M
caracteres sem substituí-los.
:%s/<Ctrl-V><Ctrl-Enter>//g
Onde %
significa "neste buffer", s
significa "substituto", /
significa "(encontre) o seguinte padrão", <Ctrl-V><Ctrl-Enter>
refere-se às teclas a serem pressionadas para obter o ^M
caractere (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.
Isso funcionou para mim:
\n
final de linha)Então no vim:
:set ff=unix
:w
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,
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.
sed s/^M//g file1.txt > file2.txt
onde ^ M é digitado pressionando simultaneamente as 3 teclas, ctrl + v + m
Use um destes comandos:
:%s/\r//g
Ou
:%s/\r\(\n\)/\1/g
Isso funcionou para mim:
:% s/\r\n/\r
Nenhuma dessas sugestões funcionou para mim, tendo conseguido um monte de ^M
quebras 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
:g/^M/s// /g
Se você digitar ^M
usando Shift+6 Caps+M
, não aceitará.
Você precisa digitar ctrl+v ctrl+m
.
^M
dá quebras de linha indesejadas. Para lidar com isso, podemos usar o sed
comando da seguinte maneira:
sed 's/\r//g'
Basta remover set binary
no seu .vimrc!
Para usar sed
no 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 \r
como caracteres especiais. Ao citar a string de comando, $''
você está dizendo ao shell para substituir \r
o \r
caractere real especificado no padrão ANSI-C.
"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()
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