Converta as terminações de linha do DOS em finais de linha do Linux no vim


717

Se eu abrir arquivos criados no Windows, todas as linhas terminarão ^M.
Como faço para excluir esses caracteres de uma só vez?


Se você faz um hexdump -C badfilee vê 0x0d 0x0a "\r\n"que esse é o seu problema.
Yzmir Ramirez 08/06/19

Respostas:


1075

dos2unix é um utilitário de linha de comando que fará isso, ou :%s/^M//gfará se você usar Ctrl- v Ctrl- mpara inserir o ^ M, ou poderá:set ff=unix e o vim fará isso por você.

Os documentos sobre a configuração 'fileformat' estão aqui , e o wiki do vim tem uma página abrangente sobre conversões de final de linha .

Como alternativa, se você mover arquivos para frente e para trás, talvez não queira convertê-los, mas sim fazê- :set ff=doslo, para que o vim saiba que é um arquivo DOS e use as convenções do DOS para fins de linha.


56
:%s/^M//gdeve ser :%s/\r//g, porque ^Msignifica apenas "combinar capital" M "no início da linha".
Bunyk

78
Não, se você fizer o que a resposta diz e 'usar ctrl-v ctrl-m para inserir o ^ M'.
pjz

2
O crtl-v não é bom, no Windows cola o conteúdo da área de transferência na linha de comando. Solução :%s/\r//gtrabalhou para mim, aplausos @Bunyk
roblogic

3
@ropata O que você deseja no Windows é ctrl-q .
Ruffin

2
Eu devo estar perdendo alguma coisa, porque set ff=unixnão faz nada. Talvez ele converta o arquivo, mas todos os ^Mcaracteres ainda estão lá.
Feltro #

276

Altere as terminações de linha na exibição:

:e ++ff=dos
:e ++ff=mac
:e ++ff=unix

Isso também pode ser usado como operação de salvamento (: w sozinho não salvará usando as terminações de linha que você vê na tela):

:w ++ff=dos
:w ++ff=mac
:w ++ff=unix

E você pode usá-lo na linha de comando:

for file in *.cpp
do 
    vi +':w ++ff=unix' +':q' "$file"
done

4
Muito obrigado. Eu tentei vi + ': wq ++ ff = unix' <filepath> para um preguiçoso como eu.
A_secenthusiast

2
Essa deve ser a resposta mais votada. :w +ff=unixé muito melhor do que a maioria das outras coisas escritas aqui, e o script bash é um ótimo bônus.
mkasberg

Os :ecomandos não parecem fazer nada na minha instalação do Windows vim. Minha visão ainda mostra os ^Mcódigos.
Grant Birchmeier

160

Eu normalmente uso

:%s/\r/\r/g

o que parece um pouco estranho, mas funciona devido à maneira como o vim corresponde aos feeds de linha. Também acho mais fácil lembrar :)


9
Isso funciona de maneira consistente entre plataformas. A melhor resposta aqui.
thebigjc

4
Nunca tive problemas com isso :set ff=unixantes, mas o arquivo que abri hoje deve ter sido particularmente estranho. Vim disse que já era, fileformat=unixmas todos os finais de linha eram ^M. Esta solução funcionou para mim.
Chris B

15
Esta solução adiciona linhas extras indesejadas para mim, duplicando o número de linhas no arquivo. :%s/\r//gem vez disso funciona para mim.
Victor Zamanian

3
Victor, é provável que seus arquivos tenham \ r \ n finais. o \ r não é lido como uma nova linha, mas o \ n é. Nos arquivos em que estou encontrando, você precisa adicionar um caractere de nova linha.
Joeyjoejoejr

2
O @ VictorZamanian's :%s/\r//gé a única solução de uso geral - especialmente para arquivos de modo misto que contêm uma mistura heterogênea de novas linhas de estilo DOS e UNIX. As soluções canónicos (por exemplo, :set ff=unix, :e ++ff=unix) assumir cada linha das extremidades tampão circulante no mesmo estilo de nova linha. Às vezes eles fazem; às vezes não. Cue sadface.
precisa saber é o seguinte

97

Eu prefiro usar o seguinte comando:

:set fileformat=unix

Você também pode usar macou dosconverter respectivamente seu arquivo para a convenção de arquivos para Macintosh ou MS-DOS / MS-Windows. E isso não faz nada se o arquivo já estiver no formato correto.

Para obter mais informações, consulte a ajuda do vim:

:help fileformat

1
Este comando parece não fazer nada no meu Windows vim. Minha visão ainda possui ^Mcaracteres.
Grant Birchmeier

Adicionando set fileformat=unixao meu arquivo .vimrc funcionou.
Joey Allen

20

:set fileformat=unix converter de dos para unix.


1
Isso realmente resolveu o problema para mim. Não consegui encontrar esses caracteres enquanto pesquisava.
Captain Insaneo

20
:%s/\r+//g

No Vim, isso retira todos os retornos de carro e deixa apenas novas linhas.


2
Por alguma razão acima, não funcionou para mim no windows gvim. Mas quando alterado :%s/\r//g, funcionou como um encanto.
soltysh

1
@soltysh:% s / \ r \ + $ // g
thinker3


10

Converta diretório de arquivos dos para Unix

Usando a linha de comando e sed, encontre todos os arquivos no diretório atual com a extensão ".ext" e remova todos os "^ M"

@ https://gist.github.com/sparkida/7773170

find $(pwd) -type f -name "*.ext" | while read file; do sed -e 's/^M//g' -i "$file"; done;

também, como mencionado acima ^ M = Ctrl+V+ Ctrl+M(não digite apenas o símbolo "^" e M)


9

dos2unix pode modificar diretamente o conteúdo do arquivo.

Você pode usá-lo diretamente no arquivo, sem necessidade de redirecionamento temporário de arquivos.

dos2unix input.txt input.txt

O exemplo acima usa o teclado americano assumido. Use a -opção 437 para usar o teclado do Reino Unido.

dos2unix -437 input.txt input.txt



6

Com o seguinte comando:

:%s/^M$//g 

Obtenha o ^Mtipo de exibição CtrlVentão CtrlM. CtrlVdiz ao Vim para pegar o próximo caractere digitado literalmente.


6

O comentário sobre como aparecer o ^ M é o que funcionou para mim. Apenas digitar "^ M" no meu vi não obteve nada (não encontrado). A sequência CTRL+ V CTRL+ Mfez perfeitamente embora.

Meu comando de substituição de trabalho foi

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

e ficou assim na minha tela:

:%s/^M/\r/g

4
Você pode usar em :%svez do :1,$s. %é uma abreviação de 1,$.
the Tin Man

5

Encontrei uma maneira muito fácil: abra o arquivo com nano: nano file.txt

Pressione CTRL+ Opara salvar, mas antes de pressionar Enter, pressione: ALT+ Dpara alternar entre finais de linha DOS e Unix / Linux ou: ALT+ Mpara alternar entre finais de linha Mac e Unix / Linux e, em seguida, pressione Enterpara salvar e CTRL+ Xpara sair.


feito isso em um servidor linux, o arquivo teve ^Mfinais. salve como dos para manter, salve como linux para remover. pode verificar usandocat -v
HattrickNZ

Esta pergunta é sobre vim, não nano.
Grant Birchmeier

5
:g/Ctrl-v Ctrl-m/s///

CtrlMé o caractere \rou retorno de carro que as terminações de linha do DOS adicionam. CtrlVdiz ao vim para inserir um CtrlMcaractere literal na linha de comando.

Tomado como um todo, esse comando substitui tudo \rpor nada, removendo-os do final das linhas.


4

Você pode usar:

vim somefile.txt +"%s/\r/\r/g" +wq

ou dos2unix utility.


3

Você pode usar o seguinte comando:
:%s/^V^M//g
onde o '^' significa usar CTRLchave.


2

O comando abaixo é usado para reformatar todos os arquivos .sh no diretório atual, eu testei no meu sistema operacional Fedora.

for file in *.sh; do awk '{ sub("\r$", ""); print }' $file >luxubutmp; cp -f luxubutmp $file; rm -f luxubutmp ;done

2

No vim, digite:

:w !dos2unix %

Isso canalizará o conteúdo do seu buffer atual para o comando dos2unix e gravará os resultados sobre o conteúdo atual. O Vim solicitará que recarregue o arquivo após


2

Para rodar diretamente no console linux: vim file.txt +"set ff=unix" +wq


1

Geralmente, existe um dos2unixcomando que você pode usar para isso, apenas certifique-se de ler o manual, pois as versões GNU e BSD diferem em como elas lidam com os argumentos.

Versão BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Versão GNU:

dos2unix $FILENAME

Como alternativa, você pode criar suas próprias dos2unixcom qualquer uma das respostas propostas aqui, por exemplo:

function dos2unix(){
    [ "${!}" ] && [ -f "{$1}" ] || return 1;

    { echo ':set ff=unix';
      echo ':wq';
    } | vim "${1}";
}

1

Eu sabia que tinha visto isso em algum lugar. Aqui está a dica de login do FreeBSD:

Precisa remover todos esses caracteres ^ M de um arquivo DOS? Tentar

tr -d \\r < dosfile > newfile
    -- Originally by Dru <genesis@istar.ca>

0

Embora esse tópico seja muito antigo, eu gostaria de colocar outro material da wikia:

%s/\r\+$//g

esse preenchimento encontra todos os sinais de retorno de carro (um e mais representantes) até o final da linha e exclui, portanto \n, fica no eol.


0

Esse é meu jeito. Abri um arquivo no DOS EOL e quando eu salvar o arquivo que será automaticamente convertido em EOL unix

autocmd BufWrite * :set ff=unix

0

se você criar um arquivo no NotePad ou NotePad ++ no Windows e trazê-lo para o Linux e abri-lo pelo vim, verá ^ M no final de cada linha. Para remover isso,

No seu terminal Linux, digite

dos2unix filename.ext

Isso fará a mágica necessária.


0

Eu queria novas linhas no lugar dos ^ M's. Perl para o resgate:

perl -pi.bak -e 's/\x0d/\n/g' excel_created.txt

Ou escreva para stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
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.