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

StackOverflow https://stackoverflow.com/questions/811193

  •  03-07-2019
  •  | 
  •  

Domanda

vim mostra su ogni riga che termina ^ M

Come posso sostituire questo con un 'normale' interruzione di linea?

È stato utile?

Soluzione

Questa è l'unica cosa che ha funzionato per me:

  

: e ++ ff = dos

Trovato su: http://vim.wikia.com/wiki/File_format

Altri suggerimenti

Comando

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

Dove <Ctrl-V><Ctrl-M> significa digitare Ctrl + V quindi 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 riga (\r)

g

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

Su Linux e Mac OS, le seguenti opere,

:%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 <=> è mappato per incollare il testo.

In vim, guarda il formato del file & # 8212; DOS o Unix:

:set filetype=unix

:set fileformat=unix

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

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

:%s/\r/\r/g

È interessante perché sto sostituendo le interruzioni di riga con lo stesso carattere, 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.

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

Suppongo che potrebbe essere unix, quindi il problema è che il tuo file è stato creato con fileformat=dos l'aggiunta di " ^ M ^ J " fino alla fine della riga ma leggi con flieformat=unix rimuovendo solo " ^ J " dalla fine della riga, lasciando il " ^ M " Là.

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.

per far corrispondere il carattere ^ M ho dovuto selezionarlo visivamente e quindi usare il comando Copia negli appunti negli appunti 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 i ritorni a capo.

Funziona come in MacVim, basato su gvim 7.

EDIT:

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 quello dato che questo sta arrivando in alto nelle ricerche su Google.

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

digitare :%s/

premi CTRL-VCTRL-M

digitare //g

premi Invia

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

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

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

^ M viene recuperato da Ctrl + V e M , quindi

s/^M//g

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

Quello che fa è solo per pulire la fine della linea di tutte le linee, rimuove la ^ M e il gioco è fatto.

Ctrl + M minimizza la mia finestra, ma Ctrl + Enter inserisce effettivamente un carattere ^M. Dovevo anche essere sicuro di non sollevare il tasto Ctrl tra le presse.

Quindi la soluzione per me era:

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

Dove <Ctrl-V><Ctrl-Enter> indica premere e tenere premuto Ctrl , premere e rilasciare V , premere e rilasciare Invio , e 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, poiché esiste già un \r invisibile dopo il %.

Per evitare ciò, si desidera eliminare i s caratteri senza sostituirli.

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

Dove / significa " in questo buffer, " // significa " sostituto, " g significa " (trova) il seguente schema, " <=> si riferisce ai tasti da premere per ottenere il carattere <=> (vedi sopra), <=> significa " con niente " (o, " con il motivo tra queste due barre, che è ") vuoto e <=> è una bandiera che significa " globalmente, quot; al contrario della prima occorrenza in una riga.

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, apri myfile
  • Esegui :e ++ff=dos per forzare un ricaricamento dell'intero file come terminazioni di riga dos.
  • Esegui :w ++ff=unix per scrivere il file utilizzando le terminazioni di riga unix
  • Esci da vim

Questo ha funzionato per me:

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

Quindi in vim:

:set ff=unix
:w

Nel mio caso,

Nulla 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 venivano scambiati tra le righe qualcosa come 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 puoi 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

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

Questo ha funzionato per me:

:% s/\r\n/\r

Per salvare i tasti premuti , puoi evitare di digitare Ctrl+V Ctrl + M inserendolo in una mappatura. 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>

Nessuno di questi suggerimenti funzionava per me, essendo riuscito a ottenere un carico di ^M interruzioni di riga mentre lavoravo con vim ed eclipse. Sospetto di aver riscontrato un caso esterno, ma nel caso in cui aiuti chiunque lo abbia fatto.

:%s/.$//g

E ha 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 fornisce interruzioni di riga indesiderate. Per gestirlo possiamo usare il comando sed come segue:

sed 's/\r//g'

Rimuovi set binary dal tuo .vimrc!

Usa uno di questi comandi:

:%s/\r//g

o

:%s/\r\(\n\)/\1/g
&

quot; 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 passato un pomeriggio alle prese con \ n ctrl-v 012 (entrambi i quali mi forniscono null). & Amp; ho lavorato su questo thread fino a quando non ho raggiunto Metagrapher.

\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-common: 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)

Magic. Sono profondamente grato

O invece di usare vim puoi semplicemente correggere le interruzioni di riga usando questo comando

fromdos <filename.txt>

Spero che sia d'aiuto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top