vim mostra su ogni riga che termina ^ M
Come faccio a sostituirlo con una interruzione di linea "normale"?
vim mostra su ogni riga che termina ^ M
Come faccio a sostituirlo con una interruzione di linea "normale"?
Risposte:
Questa è l'unica cosa che ha funzionato per me:
: e ++ ff = dos
L'ho trovato su: http://vim.wikia.com/wiki/File_format
:e ++ff=dosseguito da :set ff=unixconvertirà i finali in un formato sano.
:%s/<Ctrl-V><Ctrl-M>/\r/g
Dove <Ctrl-V><Ctrl-M>significa digitare Ctrl+ Vquindi Ctrl+ M.
:%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).
:%s/<Ctrl-V><Ctrl-M>/\r/g(dove \ r sostituisce la ^ M con una nuova riga).
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.
%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.
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).
set ff=unixcome una scorciatoia allo stesso modo di ftuna scorciatoia perfiletype
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.
\rpersonaggi con \nnonostante abbia specificato \rcome sostituto. Non lamentarti, è esattamente quello che volevo. Strano.
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.
:e ++ff=dosquindi :set ff=unixe:w
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.
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).
^ M viene recuperato da Ctrl+ Ve Mquindi
s/^M//g
Senza bisogno di usare Ctrl:
:%s/\r$//
Cosa semplice che ha funzionato per me
dos2unix filename
L'ho fatto con sed:
sed -i -e 's/\r/\n/g' filename
sed -e 's/\r/\n/g' <<< 'over and over'->oven and oven
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à.
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.
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:
myfile:e ++ff=dosper forzare un ricaricamento dell'intero file come terminazioni di riga dos.:w ++ff=unixper scrivere il file usando le terminazioni di riga unixCtrl+ 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 .
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.
Questo ha funzionato per me:
\nfine riga)Quindi in vim:
:set ff=unix
:w
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,
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.
sed s/^M//g file1.txt > file2.txt
dove ^ M viene digitato premendo contemporaneamente i 3 tasti, ctrl + v + m
Utilizzare uno di questi comandi:
:%s/\r//g
O
:%s/\r\(\n\)/\1/g
Questo ha funzionato per me:
:% s/\r\n/\r
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
:g/^M/s// /g
Se digiti ^Musando Shift+6 Caps+Mnon accetterà.
Devi digitare ctrl+v ctrl+m.
^Mdà interruzioni di riga indesiderate. Per gestirlo possiamo usare il sedcomando come segue:
sed 's/\r//g'
Basta rimuovere set binarynel tuo .vimrc!
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.
"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()
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