Come convertire l'interruzione di riga ^ M in interruzione di riga 'normale' in un file aperto in vim?


481

vim mostra su ogni riga che termina ^ M

Come faccio a sostituirlo con una interruzione di linea "normale"?



3
Si prega di cambiare la soluzione alla modifica del fileformat perché è la soluzione più pulita.
erikbwork,

1
So che questa domanda riguarda vim, ma alcune altre ricerche su Google arrivano anche in questa discussione. Quindi, se hai Eclipse installato sul tuo sistema, puoi convertire il delimitatore di linea per un singolo file o un albero di cartelle completo con pochi clic: stackoverflow.com/a/7019737/1364747
Teddy

Mi piace come chiami le normali interruzioni di linea "normali" - in contrasto con quelle ^ M interruzioni di linea :-)
DerMike

Risposte:



577

Comando

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

Dove <Ctrl-V><Ctrl-M>significa digitare Ctrl+ Vquindi Ctrl+ M.

Spiegazione

:%s

sostituto,% = tutte le righe

<Ctrl-V><Ctrl-M>

^ M caratteri (Ctrl-V è un modo Vim di scrivere il carattere Ctrl ^ e Ctrl-M scrive la M dopo l'espressione regolare, risultante in ^ M carattere speciale)

/\r/

con nuova linea ( \r)

g

E fallo a livello globale (non solo la prima occorrenza sulla linea).


21
ha rimosso i caratteri ^ M ma non inserisce il ritorno a capo.
luckytaxi,

14
@jumpnett - Devi premere gli accordi dei tasti Ctrl-V / Ctrl-M, non inserirli come testo testuale.
LeopardSkinPillBoxHat

33
Questa è sicuramente la risposta giusta per la domanda, se hai una ^ M seguita da una nuova riga, vuoi mantenere la nuova riga ma rimuovi la ^ M. Eseguendo l'altra sostituzione sotto il doppio spazio del file.
dlamblin,

12
Se ti manca ancora un ritorno a capo (ovvero la ^ M è stata rimossa ma tutto è racchiuso in un'unica riga), fai: :%s/<Ctrl-V><Ctrl-M>/\r/g(dove \ r sostituisce la ^ M con una nuova riga).
William Turrell,

7
Se stai eseguendo Vim su Windows, dovrai usare <Ctrl-Q> invece di <Ctrl-V>.
Grandammiraglio,

418

Su Linux e Mac OS, i seguenti lavori,

:%s/^V^M/^V^M/g

dove ^V^Msignifica digitare Ctrl+ V, quindi Ctrl+ M.

Nota: su Windows probabilmente si desidera utilizzare ^Qanziché ^V, poiché per impostazione predefinita ^Vè mappato per incollare il testo.


3
Perché questo ha ottenuto un downvote? Funziona, anche quando il tuo file viene schiacciato su una riga perché ha la fine della riga sbagliata.
Paul Tomblin,

2
No. Il mio modo sostituisce qualunque sia la fine della riga nel file con la fine corretta.
Paul Tomblin,

7
Questo è per un problema diverso quando il tuo file NON contiene nuove righe, che ammetterò è più comune. FYI ^ M può essere abbinato a \ r
dlamblin il

12
Questo è un comando profondamente misterioso, ma funziona per me su un mac.
Eric Walker,

5
Ho trovato l'equivalente ha %s/\r/\r/gfunzionato bene su MacVim per un file che mostra solo ^Malla fine delle righe (una lunga riga in termini di MacVim). Chiaramente significa cose diverse nel modello rispetto alle parti di ricambio di questo comando.
RichVel,

184

All'interno vim, guarda il formato del file - DOS o Unix:

:set filetype=unix

:set fileformat=unix

Il file verrà riscritto senza caratteri di ritorno a capo (CR, ^ M).


3
use: set fileformat = unix Per la maggior parte delle configurazioni il tipo di file modifica solo il tipo di sintassi in uso.
derGral,

6
Questo risolto il bug che stavo riscontrando ... Vim iniziò a pensare che il mio file formattato UNIX fosse Windows e le righe appena modificate mostrassero ^ M in git diff.
Thomas Hunter II,

Deve essere dipendente dal sistema. Oggi ha funzionato. Il comando set viene eseguito all'interno di vim, a proposito.
Gbarry,

1
fantastico! perché il fileformat è dos,
impostalo su

3
Questo funziona anche su vi BTW, e puoi fare set ff=unixcome una scorciatoia allo stesso modo di ftuna scorciatoia perfiletype
Posva

110

Un file che avevo creato con BBEdit visto in MacVim mostrava un sacco di ^Mritorni di riga invece di quelli normali. La seguente sostituzione di stringa ha risolto il problema - spero che questo aiuti:

:%s/\r/\r/g

È interessante perché sto sostituendo le interruzioni di riga con lo stesso personaggio, ma suppongo che Vim abbia solo bisogno di ottenere un nuovo display per visualizzarlo correttamente. Sarei interessato a conoscere i meccanismi alla base del perché questo funziona.


1
Esiste la tendenza delle funzioni di ricerca ad accettare regole più ampie per il riconoscimento delle sequenze di fine riga. Ma ha un significato specifico quando viene scritto come dati.
Gbarry,

Questo ha funzionato per me in Windows gVim per risolvere un file che non aveva interruzioni di riga, solo un sacco di ^ M invece.
lampeggia il

2
Da tutte le soluzioni offerte in questa pagina, questo è stato l'unico modello che ha funzionato per me nel rimuovere ^ M da un file CSV. Utilizzando MacVim.
B6431,

+1 Ha funzionato anche per me mentre eseguivo SSHing su Ubuntu Trusty da Windows usando Mobaterm
Carl

Quindi, questo sembrava sostituire tutti i \rpersonaggi con \nnonostante abbia specificato \rcome sostituto. Non lamentarti, è esattamente quello che volevo. Strano.
Ciambella

34

Per prima cosa, usa :set ff?per capire il formato del tuo file.

Immagino che potrebbe essere unix, quindi il problema è che il tuo file è stato creato con l' fileformat=dosaggiunta di "^ M ^ J" alla fine della riga, ma leggi flieformat=unixrimuovendo solo "^ J" dalla fine della riga, lasciando lì "^ M".

Basta inserire :e ++ff=dosnella riga di comando di Vim per cambiare il formato del file da unix a dos. Dovrebbe risolvere il problema. In caso contrario, :%s/\r//gdovrebbe aiutarti.


3
Ho dovuto fare entrambe le cose. :e ++ff=dosquindi :set ff=unixe:w
Max

29

per far corrispondere il carattere ^ M ho dovuto selezionarlo visivamente e quindi utilizzare il comando Copia negli Appunti del SO per recuperarlo. Puoi testarlo facendo una ricerca del personaggio prima di provare il comando di sostituzione.

/^M

dovrebbe selezionare la prima linea errata

:%s/^M/\r/g

sostituirà tutti gli erranti ^ M con ritorni a capo.

Questo è come funzioni in MacVim, che si basa su gvim 7.

MODIFICARE:

Avere di nuovo questo problema sul mio computer Windows 10, che ha Ubuntu per Windows, e penso che questo stia causando problemi di formato file per vim. In questo caso, cambiare ff in unix, mac o dos non ha fatto altro che cambiare ^ M in ^ J e viceversa.

La soluzione in questo caso:

:%s/\r$/ /g
:%s/ $//g

Il motivo per cui ho seguito questa strada è perché volevo essere sicuro di non essere distruttivo con il mio file. Avrei potuto :%s/\r$//gma ciò avrebbe cancellato i ritorni del carrello e avrebbe potuto avere risultati inaspettati. Invece convertiamo il singolo carattere CR, qui un carattere ^ M, in uno spazio, quindi rimuoviamo tutti gli spazi alla fine delle linee (che per me è un risultato desiderabile a prescindere)

Ci scusiamo per aver rianimato una vecchia domanda a cui è stata data una risposta da tempo, ma sembra che ci sia un po 'di confusione in corso e ho pensato che avrei aiutato a chiarire un po' di tutto ciò poiché questo sta arrivando in alto nelle ricerche di Google.


1
premendo ctrl-v ctrl-m può funzionare anche per inserire il carattere, prima. ma il \ r è ciò che inserisce il ritorno a capo corretto.
Metagrafo

1
Questa è la risposta esatta. Come detto sopra, usa <ctrl-v> <ctrl-m> per inserire la letterale ^ M nel comando.
carlosayam,

1
Sono d'accordo, anche se sono certo che se ciò avesse funzionato per me al momento della pubblicazione originale, non avrei pubblicato. ;)
Metagrapher

22

Nessuno di questi ha funzionato per me, quindi ho provato questo, che ha funzionato:

genere :%s/

stampa CTRL-VCTRL-M

genere //g

stampa Enter

Quindi il comando generale in Vim dovrebbe sembrare :%s/^M//g

Cosa fa: :%s(trova e sostituisci) /^M/(quel simbolo) /(senza caratteri) g(a livello globale).


Bang !! Funziona su Mac.
shamail,


15

Senza bisogno di usare Ctrl: :%s/\r$//


1
Questo è anche il modo in cui lo faccio. Non ricordo mai il comando
pixel 67

Questo è il modo consigliato per rimuovere questi finali.
Metagrafo,


12

L'ho fatto con sed:

sed -i -e 's/\r/\n/g' filename


Sei sicuro che funzioni? Su OSX: sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
Armand,

Sì, funziona (lo uso molto), ma su OSX se non hai installato la versione GNU di sed, potrebbe non funzionare. La versione di sed che Apple spedisce di default è molto diversa (purtroppo) rispetto alla versione GNU che viene distribuita su tutte le distribuzioni Linux. Controlla la risposta a questa domanda per ulteriori informazioni: stackoverflow.com/q/30003570/2062384
Freedom_Ben

Grazie @Freedom_Ben. Quindi sembra che funzioni per GNU sedma non per BSD sed(come si trova su OSX). Chiunque corregga le interruzioni di riga probabilmente sta lavorando con un mix di sistemi operativi, quindi è utile essere chiari su quando la risposta funzionerà.
Armand,

10

Che dire solo: ha :%s/\r//g funzionato totalmente per me.

Ciò che fa è semplicemente pulire la fine della linea di tutte le linee, rimuove la ^ M e il gioco è fatto.


9

Ci sono molte altre risposte a questa domanda, ma comunque quanto segue funziona meglio per me, poiché avevo bisogno di una soluzione a riga di comando:

vim -u NONE -c 'e ++ff=dos' -c 'w ++ff=unix' -c q myfile

Spiegazione:

  • Senza caricare alcun file .vimrc, aprire myfile
  • Esegui :e ++ff=dosper forzare un ricaricamento dell'intero file come terminazioni di riga dos.
  • Esegui :w ++ff=unixper scrivere il file usando le terminazioni di riga unix
  • Esci da Vim

3
grazie! questo risolto il mio problema e trovò utile usarlo negli script
Peddipaga,

8

Ctrl+ Mminimizza la mia finestra, ma Ctrl+ Enterinserisce effettivamente un ^Mpersonaggio. Dovevo anche essere sicuro di non sollevare il Ctrltasto tra una pressione e l'altra.

Quindi la soluzione per me era:

:%s/<Ctrl-V><Ctrl-Enter>/\r/g

Dove <Ctrl-V><Ctrl-Enter>significa tenere premuto Ctrl , premere e rilasciare V, premere e rilasciare Enter, quindi rilasciare Ctrl .

Se stai lavorando su un file generato da Windows

La soluzione di cui sopra aggiungerà una linea aggiuntiva tra le linee esistenti, perché esiste già un invisibile \rdopo il ^M.

Per evitare ciò, si desidera eliminare i ^Mcaratteri senza sostituirli.

:%s/<Ctrl-V><Ctrl-Enter>//g

Dove %significa "in questo buffer", ssignifica "sostituto", /significa "(trova) il seguente modello", si <Ctrl-V><Ctrl-Enter>riferisce ai tasti da premere per ottenere il ^Mcarattere (vedi sopra), //significa "con nulla" (o, "con il modello tra queste due barre, che è vuota "), ed gè una bandiera che significa" globalmente ", in contrapposizione alla prima occorrenza in una riga.


7

Questo ha funzionato per me:

  1. Imposta il formato del file su unix ( \nfine riga)
  2. salva il file

Quindi in vim:

:set ff=unix
:w

1
Questo ha funzionato per me, mentre la risposta accettata no.
Marcello Romani,

7

Nel mio caso,

Niente sopra ha funzionato, ho avuto un file CSV copiato su macchina Linux dal mio mac e ho usato tutti i comandi sopra ma niente ha aiutato tranne quello sotto

tr "\015" "\n" < inputfile > outputfile

Avevo un file in cui ^ M personaggi erano alternati tra le righe qualcosa di simile al di sotto

Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKT6TG,TRO_WBFB_500,Trico,CARS,Audi,A4,35 TFSi Premium,,CAAUA4TP^MB01BNKTG0A,TRO_WB_T500,Trico,

5

In alternativa, ci sono utility open source chiamate dos2unix e unix2dos disponibili che fanno proprio questo. Su un sistema Linux sono probabilmente installati di default; per un sistema Windows è possibile scaricarli da http://www.bastet.com/ tra gli altri.


5
sed s/^M//g file1.txt > file2.txt

dove ^ M viene digitato premendo contemporaneamente i 3 tasti, ctrl + v + m


4

usa l'utilità dos2unix se il file è stato creato su Windows, usa l'utilità mac2unix se il file è stato creato su mac. :)


mai sentito parlare di mac2unix prima, avrei votato di nuovo se potessi!
Kuf,

Huray! questa è la strada da percorrere!
Privato



1

Per salvare i tasti premuti , puoi evitare di digitare Ctrl+ VCtrl+ Minserendolo in un mapping. Basta aprire un file contenente un carattere ^ M, strattonarlo e incollarlo in una riga come questa nel tuo .vimrc:

nnoremap <Leader>d :%s/^M//g<CR>

1

Nessuno di questi suggerimenti funzionava per me, essendo riuscito a ottenere un sacco di ^Minterruzioni di linea mentre lavoravo con vim ed eclipse. Ho il sospetto di aver riscontrato un caso esterno, ma nel caso in cui aiuta qualcuno che ho fatto.

:%s/.$//g

E risolto il mio problema


Questo rimuoverà QUALSIASI carattere alla fine di una riga. Se hai una linea che, per qualche motivo, non è terminata da ^ M, rimuoverai anche quel carattere, e saresti inaspettato. Questo non dovrebbe essere il caso, ma nel caso in cui lo sia, e tu non lo sai, allora potresti sporcare il tuo file in un modo molto difficile da identificare.
Metagrafo,

1
:g/^M/s// /g

Se digiti ^Musando Shift+6 Caps+Mnon accetterà.

Devi digitare ctrl+v ctrl+m.


1

^Mdà interruzioni di riga indesiderate. Per gestirlo possiamo usare il sedcomando come segue:

sed 's/\r//g'

idk perché questo è stato ridimensionato a -1 ... perché usa sed? puoi fare la stessa sostituzione in vim e dovrebbe funzionare
Metagrapher

1

Basta rimuovere set binarynel tuo .vimrc!


In un altro thread, si consigliava "set binary" per eliminare l'inserimento automatico della nuova riga.
Dexter2305,

1

Per utilizzare sedsu MacOS, procedere come segue:

sed -i.bak $'s/\r//' <filename>

Spiegazione: La $'STRING'sintassi qui riguarda la shell bash. I Mac non trattano \rcome un personaggio speciale. Citando la stringa di comando in $''stai dicendo alla shell di sostituirla \rcon il \rcarattere effettivo specificato nello standard ANSI-C.


0

"Questa funzione conserva l'elenco dei salti

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()

In questo caso, cosa c'è di sbagliato nell'usare il comando dos2unix nativo di * NIX? linux.die.net/man/1/dos2unix
Metagrapher

0

Ho trascorso un pomeriggio alle prese con \ n ctrl-v 012 (entrambi i quali mi forniscono null). e ho lavorato su questo filo fino a quando non ho raggiunto Metagrapher's.

\r ha funzionato bene per me!

/),/s/),/)\r/g

trasformato in qualcosa del genere:

lista nera 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-comune: i386 (1.0.22-7.3,

in qualcosa del genere:

26 libwv-1.2-4: i386 (1.2.9-3, automatico)
27 openjdk-6-jre-headless: i386 (6b24-1.11.4-3, automatico)
28 jed: i386 (0.99.19-2.1)

Magia. Sono profondamente grato

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.