Converti le terminazioni di riga DOS in terminazioni di linea Linux in vim


717

Se apro i file che ho creato in Windows, le linee finiscono tutte ^M.
Come posso eliminare tutti questi caratteri contemporaneamente?


Se lo fai hexdump -C badfilee vedi 0x0d 0x0a "\r\n"che è il tuo problema.
Yzmir Ramirez,

Risposte:


1075

dos2unix è un'utilità a riga di comando che lo farà, o lo :%s/^M//gfarà se si utilizza Ctrl- v Ctrl- mper immettere ^ M, oppure è possibile :set ff=unixe vim lo farà per voi.

I documenti sull'impostazione 'fileformat' sono qui e il wiki di vim ha una pagina completa che termina le conversioni .

In alternativa, se sposti molto i file avanti e indietro, potresti non volerli convertire, ma piuttosto farlo :set ff=dos, quindi Vim saprà che è un file DOS e utilizzerà le convenzioni DOS per i finali di riga.


56
:%s/^M//gdovrebbe essere :%s/\r//g, perché ^Msignifica semplicemente "corrispondenza maiuscola" M "all'inizio della riga".
Bunyk,

78
Non se fai come dice la risposta e 'usa ctrl-v ctrl-m per inserire la ^ M'.
pjz,

2
crtl-v non va bene, su Windows incolla il contenuto degli appunti sulla riga di comando. La soluzione ha :%s/\r//gfunzionato per me, evviva @Bunyk
roblogic

3
@ropata Quello che vuoi su Windows è ctrl-q .
ruffin,

2
Mi manca qualcosa, perché set ff=unixnon fa nulla. Forse converte il file, ma tutti i ^Mpersonaggi sono ancora lì.
Felwithe il

276

Modifica le terminazioni di riga nella vista:

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

Questo può anche essere usato come operazione di salvataggio (: w da solo non salverà usando le terminazioni di linea che vedi sullo schermo):

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

E puoi usarlo dalla riga di comando:

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

4
Grazie mille. Ho provato vi + ': wq ++ ff = unix' <percorso file> per uno pigro come me.
a_secenthusiast

2
Questa dovrebbe essere la risposta più votata. :w +ff=unixè molto più bello della maggior parte delle altre cose scritte qui, e lo script bash è un bel bonus.
mkasberg,

I :ecomandi non sembrano fare nulla sulla mia installazione di Windows Vim. La mia vista mostra ancora i ^Mcodici.
Grant Birchmeier,

160

Io di solito uso

:%s/\r/\r/g

che sembra un po 'strano, ma funziona a causa del modo in cui VIM abbina l'alimentazione di linea. Trovo anche più facile da ricordare :)


9
Funziona costantemente su tutte le piattaforme. La migliore risposta qui.
thebigjc,

4
Non ho mai avuto problemi con :set ff=unixprima, ma il file che ho aperto oggi deve essere stato particolarmente strano. Vim ha detto che lo era già, fileformat=unixma tutti i finali erano ^M. Questa soluzione ha funzionato per me.
Chris B,

15
Questa soluzione aggiunge righe extra indesiderate per me, raddoppiando il numero di righe nel file. :%s/\r//ginvece funziona per me.
Victor Zamanian,

3
Victor, i tuoi file probabilmente hanno una terminazione \ r \ n. il \ r non viene letto come una nuova riga ma il \ n lo è. Nei file in cui mi imbatto sono \ r e devi aggiungere un carattere di nuova riga.
Joeyjoejoejr,

2
@ VictorZamanian's :%s/\r//gè il unica soluzione per tutti gli usi, in particolare per i file in modalità mista che contengono una miscela eterogenea di newline in stile DOS e UNIX. Le soluzioni canoniche (ad es. :set ff=unix, :e ++ff=unix) Assumono che ogni riga del buffer corrente termini nello stesso stile newline. A volte lo fanno; a volte no. Cue sadface.
Cecil Curry,

97

Preferisco usare il seguente comando:

:set fileformat=unix

È inoltre possibile utilizzare maco dosper convertire rispettivamente il file in convenzione macintosh o MS-DOS / MS-Windows. E non fa nulla se il file è già nel formato corretto.

Per ulteriori informazioni, consultare la guida di vim:

:help fileformat

1
Questo comando non sembra fare nulla sul mio Windows Vim. La mia vista ha ancora dei ^Mcaratteri.
Grant Birchmeier,

L'aggiunta set fileformat=unixal mio file .vimrc ha funzionato.
Joey Allen,

20

:set fileformat=unix per convertire da dos a unix.


1
Questo in realtà ha risolto il problema per me. Non sono riuscito a trovare quei personaggi durante la ricerca.
Capitano Insaneo,

20
:%s/\r+//g

In Vim, ciò rimuove tutti i ritorni a capo e lascia solo nuove righe.


2
Per qualche motivo sopra non ha funzionato per me sotto windows gvim. Ma quando cambiato in :%s/\r//gha funzionato come un fascino.
soltysh

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


10

Converti la directory dei file da DOS in Unix

Utilizzando la riga di comando e sed, trova tutti i file nella directory corrente con l'estensione ".ext" e rimuovi tutti "^ 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;

inoltre, come menzionato sopra ^ M = Ctrl+V+ Ctrl+M(non solo digitare il simbolo "^" con il cursore e M)


9

dos2unix può modificare direttamente il contenuto del file.

Puoi usarlo direttamente sul file, senza necessità di reindirizzamento temporaneo del file.

dos2unix input.txt input.txt

Quanto sopra utilizza la tastiera americana presunta. Utilizzare l' -opzione 437 per utilizzare la tastiera del Regno Unito.

dos2unix -437 input.txt input.txt



6

Con il seguente comando:

:%s/^M$//g 

Prendi il ^Ma comparire tipo CtrlVallora CtrlM. CtrlVdice a Vim di prendere il personaggio successivo inserito letteralmente.


6

Il commento su come far apparire ^ M è ciò che ha funzionato per me. Digitando semplicemente "^ M" nel mio vi non si ottiene nulla (non trovato). La sequenza CTRL+ V CTRL+ Mha funzionato perfettamente però.

Il mio comando di sostituzione funzionante era

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

e sembrava così sul mio schermo:

:%s/^M/\r/g

4
È possibile utilizzare :%sinvece di :1,$s. %è una scorciatoia per 1,$.
Tin Man

5

Ho trovato un modo molto semplice: apri il file con nano: nano file.txt

Premere CTRL+ Oper salvare, ma prima di premere Enter, premere: ALT+ Dper alternare le terminazioni di riga DOS e Unix / Linux, oppure: ALT+ Mper alternare tra le terminazioni di Mac e Unix / Linux, quindi premere Enterper salvare e CTRL+ Xper uscire.


fatto questo su un server Linux, il file ha ^Mterminato. salva come dos da conservare, salva come linux da rimuovere. posso controllare usandocat -v
HattrickNZ

Questa domanda riguarda vim, non nano.
Concedi Birchmeier il

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

CtrlMè il carattere \r, o ritorno a capo, che aggiungono i finali di riga DOS. CtrlVdice a Vim di inserire un CtrlMcarattere letterale nella riga di comando.

Nel suo insieme, questo comando sostituisce tutto \rcon niente, rimuovendoli dalle estremità delle linee.


4

Puoi usare:

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

oppure dos2unix utility.


3

Puoi usare il seguente comando:
:%s/^V^M//g
dove '^' significa usa CTRLchiave.


2

il comando seguente viene usato per riformattare tutti i file .sh nella directory corrente, l'ho testato sul mio sistema operativo Fedora.

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

2

In vim, digitare:

:w !dos2unix %

Questo invierà il contenuto del buffer corrente al comando dos2unix e scriverà i risultati sul contenuto corrente. Vim chiederà di ricaricare il file dopo


2

Per eseguire direttamente nella console Linux: vim file.txt +"set ff=unix" +wq


1

Di solito c'è un dos2unixcomando che puoi usare per questo, assicurati solo di leggere il manuale poiché le versioni GNU e BSD differiscono su come gestiscono gli argomenti.

Versione BSD:

dos2unix $FILENAME $FILENAME_OUT
mv $FILENAME_OUT $FILENAME

Versione GNU:

dos2unix $FILENAME

In alternativa, puoi crearne uno tuo dos2unixcon una qualsiasi delle risposte proposte qui, ad esempio:

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

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

1

Sapevo di averlo visto da qualche parte. Ecco il suggerimento per il login di FreeBSD:

Devi rimuovere tutti quei ^ M caratteri da un file DOS? Provare

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

0

Anche se questo argomento è molto vecchio, mi piacerebbe mettere un'altra roba dalla wiki:

%s/\r\+$//g

che riempiono trovano tutti i segni di ritorno a capo (una e più ripetizioni) fino alla fine della riga ed eliminano, quindi \nrimarranno su eol.


0

Questo è il mio modo Ho aperto un file in DOS EOL e quando salvo il file che verrà automaticamente convertito in UNIX EOL

autocmd BufWrite * :set ff=unix

0

se crei un file in NotePad o NotePad ++ in Windows e lo porti su Linux e lo apri con vim, vedrai ^ M alla fine di ogni riga. Per rimuovere questo,

Sul tuo terminale Linux, digita

dos2unix nomefile.ext

Questo farà la magia richiesta.


0

Volevo newline al posto delle ^ M. Perl in soccorso:

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

O per scrivere su stdout:

perl -p -e 's/\x0d/\n/g' < excel_created.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.