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=dos
seguito da :set ff=unix
convertirà 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^M
significa digitare Ctrl+ V, quindi Ctrl+ M.
Nota: su Windows probabilmente si desidera utilizzare ^Q
anziché ^V
, poiché per impostazione predefinita ^V
è mappato per incollare il testo.
%s/\r/\r/g
funzionato bene su MacVim per un file che mostra solo ^M
alla 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=unix
come una scorciatoia allo stesso modo di ft
una scorciatoia perfiletype
Un file che avevo creato con BBEdit visto in MacVim mostrava un sacco di ^M
ritorni 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.
\r
personaggi con \n
nonostante abbia specificato \r
come 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=dos
aggiunta di "^ M ^ J" alla fine della riga, ma leggi flieformat=unix
rimuovendo solo "^ J" dalla fine della riga, lasciando lì "^ M".
Basta inserire :e ++ff=dos
nella riga di comando di Vim per cambiare il formato del file da unix a dos. Dovrebbe risolvere il problema. In caso contrario, :%s/\r//g
dovrebbe aiutarti.
:e ++ff=dos
quindi :set ff=unix
e: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$//g
ma 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
sed
ma 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=dos
per forzare un ricaricamento dell'intero file come terminazioni di riga dos.:w ++ff=unix
per scrivere il file usando le terminazioni di riga unixCtrl+ Mminimizza la mia finestra, ma Ctrl+ Enterinserisce effettivamente un ^M
personaggio. 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 \r
dopo il ^M
.
Per evitare ciò, si desidera eliminare i ^M
caratteri senza sostituirli.
:%s/<Ctrl-V><Ctrl-Enter>//g
Dove %
significa "in questo buffer", s
significa "sostituto", /
significa "(trova) il seguente modello", si <Ctrl-V><Ctrl-Enter>
riferisce ai tasti da premere per ottenere il ^M
carattere (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:
\n
fine 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 ^M
interruzioni 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 ^M
usando Shift+6 Caps+M
non accetterà.
Devi digitare ctrl+v ctrl+m
.
^M
dà interruzioni di riga indesiderate. Per gestirlo possiamo usare il sed
comando come segue:
sed 's/\r//g'
Basta rimuovere set binary
nel tuo .vimrc!
Per utilizzare sed
su MacOS, procedere come segue:
sed -i.bak $'s/\r//' <filename>
Spiegazione: La $'STRING'
sintassi qui riguarda la shell bash. I Mac non trattano \r
come un personaggio speciale. Citando la stringa di comando in $''
stai dicendo alla shell di sostituirla \r
con il \r
carattere 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