Como converter o linebreak ^ M para linebreak 'normal' em um arquivo aberto no vim?
-
03-07-2019 - |
Pergunta
mostra vim em cada linha que termina ^ M
Como eu faço para substituir este com uma quebra de linha 'normal'?
Solução
Esta é a única coisa que funcionou para mim:
: e ++ ff = dos
Encontrado-lo em: http://vim.wikia.com/wiki/File_format
Outras dicas
Comando
:%s/<Ctrl-V><Ctrl-M>/\r/g
Onde meios <Ctrl-V><Ctrl-M>
tipo Ctrl + V , em seguida, Ctrl + M .
Explicação
:%s
substituto,% = todas as linhas
<Ctrl-V><Ctrl-M>
^ M caracteres (o Ctrl-V é uma maneira Vim de escrever o Ctrl ^ caráter e Ctrl-M escreve o M após a expressão regular, resultante para ^ M carácter especial)
/\r/
com nova linha (\r
)
g
E fazê-lo globalmente (e não apenas a primeira ocorrência na linha).
No Linux e Mac OS, as seguintes obras,
:%s/^V^M/^V^M/g
em que meios ^V^M
tipo Ctrl + V , em seguida, Ctrl + M .
. Nota: no Windows, você provavelmente vai querer usar ^Q
vez de ^V
, uma vez por ^V
padrão é mapeado para colar texto
Dentro vim
, olhar para o formato de arquivo - DOS ou Unix:
:set filetype=unix
:set fileformat=unix
O arquivo será escrito de volta, sem retorno de carro (CR, ^ M) caracteres.
Um arquivo que eu tinha criado com BBEdit visto em MacVim foi exibindo um monte de linha ^M
retornos em vez dos regulares. A string seguinte substituir resolveu o problema - espero que isso ajude:
:%s/\r/\r/g
É interessante porque eu estou substituindo quebras de linha com o mesmo personagem, mas suponho Vim apenas precisa de obter um novo \ r para exibir corretamente. Eu estaria interessado em conhecer a mecânica subjacente de por que isso funciona.
Em primeiro lugar, o uso :set ff?
para descobrir o formato de arquivo do arquivo é.
Eu acho que poderia ser unix
, então o problema é o arquivo foi criado com fileformat=dos
acrescentando "^ M ^ J" para o final da linha, mas ler com flieformat=unix
única removendo o "^ J" a partir do final de linha, deixando o " ^ M" lá.
Apenas :e ++ff=dos
entrada na linha de comando Vim para alterar o formato do seu arquivo do UNIX para o DOS. Ele deve resolver o problema. Se não, :%s/\r//g
deve ajudá-lo.
a fim de obter o personagem ^ M para corresponder eu tinha para selecioná-lo visualmente e, em seguida, usar a cópia do sistema operacional para o comando da área de transferência para recuperá-lo. Você pode testá-lo, fazendo uma pesquisa para o personagem antes de tentar o comando substituir.
/^M
deve selecionar a primeira linha mau
:%s/^M/\r/g
irá substituir todo o errante ^ M com retornos de carro.
Este é como funções em MacVim, que é baseada no gvim 7.
EDIT:
Tendo este problema novamente na minha máquina Windows 10, que tem Ubuntu para Windows, e eu acho que isso está causando problemas FileFormat para vim. Neste caso, mudar o ff no Unix, Mac ou dos não fez nada a não ser para mudar o ^ M para ^ J e de volta.
A solução neste caso:
:%s/\r$/ /g
:%s/ $//g
A razão que eu fui esta rota é porque eu queria para garantir que eu estava sendo não-destrutiva com o meu arquivo. Eu poderia ter :%s/\r$//g
mas que teria eliminado os retornos de carro para a direita fora, e podia ter resultados inesperados. Em vez disso, converter o caractere CR singular, aqui um caracter ^ M, em um espaço e, em seguida, remover todos os espaços no final das linhas (que para mim é um resultado desejável independentemente)
Infelizmente para reviver uma velha questão que desde então tem sido respondida, mas parecia haver alguma confusão em andamento e eu pensei que eu ia ajudar a esclarecer alguns dos que até já que este é vindo para o alto nas buscas do Google.
Nenhum deles funcionou para mim, então eu tentei isso, que trabalhou:
tipo :%s/
prima CTRL-V CTRL-H
tipo //g
pressione Enter
Assim, o comando geral no Vim deviam parecer :%s/^M//g
O que isto significa:. :%s
(localizar e substituir) /^M/
(esse símbolo) /
(sem caracteres) g
(globalmente)
Sem necessidade de 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
^ M é recuperado por Ctrl + V e M , assim como
s/^M//g
O que sobre apenas:
:%s/\r//g
Isso totalmente funcionou para mim.
O que isto faz é apenas para limpar o fim da linha de todas as linhas, ele remove o ^ M e é isso.
Ctrl + M minimiza minha janela, mas Ctrl + Enter realmente insere um caractere ^M
. Eu também tinha que ter certeza de não decolar o Ctrl chave entre prensas.
Portanto, a solução para mim foi:
:%s/<Ctrl-V><Ctrl-Enter>/\r/g
Onde meios <Ctrl-V><Ctrl-Enter>
para pressione e segure Ctrl , pressione e solte V , pressione e solte Enter , e, em seguida, solte Ctrl .
Se você estiver trabalhando em um arquivo gerado do Windows
A solução acima irá adicionar uma linha adicional entre as linhas existentes, porque já existe um \r
invisível após a ^M
.
Para evitar isso, de que deseja excluir os personagens ^M
sem substituí-los.
:%s/<Ctrl-V><Ctrl-Enter>//g
Onde meios %
"neste tampão," meios s
"substitutas", significa /
"(encontrar) o seguinte padrão:" <Ctrl-V><Ctrl-Enter>
refere-se às teclas de pressionar para obter o personagem ^M
(veja acima), meios //
"com nada"(ou 'com o padrão de entre estas duas barras, que está vazio'), e g
é um
Existem muitas outras respostas para essa pergunta, mas ainda assim, o seguinte funciona melhor para mim, como 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 qualquer arquivo .vimrc,
myfile
aberta ??li> - Executar
:e ++ff=dos
para forçar uma recarga de todo o arquivo como terminações dos de linha. - Executar
:w ++ff=unix
para gravar o arquivo usando finais de linha Unix - Sair vim
Isso funcionou para mim:
- Definir formato de arquivo para unix (linha
\n
fim) - Salve o arquivo
Assim, em 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 eu usei todos os comandos acima, mas nada ajudou, mas o abaixo de um
tr "\015" "\n" < inputfile > outputfile
Eu tinha um arquivo no qual caracteres ^ M foram sandwitched entre as linhas de 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 open-source utilitários chamados dos2unix e unix2dos disponíveis que fazer isso mesmo. Em um sistema linux eles provavelmente são instalados por padrão; para um sistema de janelas que você pode baixá-los a partir http://www.bastet.com/ entre outros.
sed s/^M//g file1.txt > file2.txt
^ onde M é digitado pressionando simultaneamente as teclas 3, ctrl + v + m
utilidade uso dos2unix se o arquivo foi criado no Windows, usar a utilidade mac2unix se o arquivo foi criado no mac. :)
Isso funcionou para mim:
:% s/\r\n/\r
Para poupar movimentos , você pode evitar a digitação Ctrl + V Ctrl + M , colocando isso em um mapeamento. Basta abrir um arquivo contendo um caracter ^ M, arrancá-lo e colá-lo em uma linha com esta no seu .vimrc:
nnoremap <Leader>d :%s/^M//g<CR>
Nenhuma dessas sugestões foram trabalhar para mim ter conseguido obter uma carga de quebras de linha ^M
ao trabalhar com ambos vim e eclipse. Eu suspeito que eu encontrei um caso fora, mas no caso de ajuda a ninguém que eu fiz.
:%s/.$//g
E é resolvido meu problema
:g/^M/s// /g
Se você digitar ^M
usando Shift+6 Caps+M
não vai aceitar.
Você precisa digitar ctrl+v ctrl+m
.
^M
dá quebras de linha indesejados. Para lidar com isso, podemos usar o comando sed
da seguinte forma:
sed 's/\r//g'
Apenas removeset binary
em seu .vimrc!
Use um destes comandos:
:%s/\r//g
ou
:%s/\r\(\n\)/\1/g
" 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()
Eu passei uma tarde lutando com \ n ctrl-v 012 (ambos os quais me fornecer null). & Trabalhado através esta discussão até chegar metagrapher é.
\r
funcionou bem para mim!
/),/s/),/)\r/g
virou algo como isto:
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-comum: i386 (1.0.22-7.3,
em algo parecido com 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)
Mágica. Estou profundamente grato
Ou em vez de usar vim você pode simplesmente corrigir as quebras de linha usando este comando
fromdos <filename.txt>
Espero que ajude!