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=dosseguido por :set ff=unixirá 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^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.
%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.
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=unixum 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.
\rpersonagens, \napesar de especificar \rcomo 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=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.
:e ++ff=dosentão :set ff=unixe: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$//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.
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
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á.
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=dospara forçar uma recarga do arquivo inteiro como terminações de linha dos.:w ++ff=unixpara gravar o arquivo usando terminações de linha unixCtrl+ 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 .
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.
Isso funcionou para mim:
\nfinal 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 ^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
:g/^M/s// /g
Se você digitar ^Musando Shift+6 Caps+M, não aceitará.
Você precisa digitar ctrl+v ctrl+m.
^Mdá quebras de linha indesejadas. Para lidar com isso, podemos usar o sedcomando da seguinte maneira:
sed 's/\r//g'
Basta remover set binaryno seu .vimrc!
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.
"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