Cosè “^ M” e come me ne sbarazzo?

Quando apro il file in Vim, vedo strani ^M caratteri.

Sfortunatamente, il motore di ricerca preferito in tutto il mondo non funziona bene con i caratteri speciali nelle query, quindi sto chiedendo qui:

  • Che cosè questo ^M carattere?

  • Come può esserci arrivato?

  • Come posso eliminarlo?

Commenti

  • È ‘ un digrafo di caratteri di controllo, per ulteriori informazioni info: help digraph-table.
  • VS Code ha unopzione EOL nella parte inferiore che convertirà automaticamente un file aperto.
  • @StackUnderflow durante lutilizzo VSCode, la modifica delle terminazioni di riga in LF quando si lavora su file Linux aiuta. Uso WSL … Un file Windows come $ profile non ha problemi con il file Linux che termina con LF. Forse Win batte Linux qui.

Answer

Il ^M è un carattere di ritorno a capo. Se vedi questo, probabilmente stai guardando un file che ha avuto origine nel mondo DOS / Windows, dove la fine della riga è contrassegnata da una coppia di ritorno a capo / nuova riga, mentre nel mondo Unix, la fine della riga è contrassegnato da una singola nuova riga.

Leggi questo articolo per maggiori dettagli e anche la voce di Wikipedia per newline .

Questo articolo discute come impostare vim per modificare in modo trasparente file con estremità differenti marcatori di riga.

Se hai un file con ^M alla fine di alcune righe e vuoi sbarazzartene, usa questo in Vim:

:s/^M$// 

(Premi Ctrl + V Ctrl + M per inserirlo ^M.)

Commenti

  • Prova :%s/^M/\r/g invece di rimuovere ^M e sostituire ^M con il carattere di nuova riga . Senza %, il comando si applica solo alla riga corrente. E mi sono imbattuto in alcuni esempi in cui ^M non è alla fine della riga, come The first line.^MThe second line.
  • Oppure se tu don ‘ non vuoi un sacco di interruzioni di riga che potresti semplicemente fare :%s/^M/
  • Se ‘ è solo un ritorno a capo da solo, che potrebbe essere la classica interruzione di riga (pre-Unix) Macintosh. Anche alcuni programmi più recenti come Excel 2007 per Mac lo fanno per qualche motivo.
  • @larsks Ma altap.cz/salamander/help/salamand/appendix_txtfiles dice che ^M è utilizzato in UNIX
  • Non sono sicuro che ‘ sia qualcosa nella mia configurazione di vim, ma devo digitare Ctrl+Q, quindi Ctrl+M per generare quel carattere!

Risposta

Un modo più semplice per farlo è utilizzare il seguente comando:

dos2unix filename 

Questo comando funziona anche con i modelli di percorso, ad esempio

dos2unix path/name* 

Se non funziona, prova a utilizzare una modalità diversa:

dos2unix -c mac filename 
  • -c Imposta la modalità di conversione. Dove CONVMODE è uno di: ascii, 7bit, iso, mac con ascii come impostazione predefinita.

Commenti

  • +1 per aver menzionato il valore predefinito del flag -c e altre opzioni. Al primo tentativo, limpostazione predefinita non ‘ ha i risultati attesi. Con dos2unix -c max ha funzionato. dos2unix: converting file launch_me.sh to Unix format...
  • Piccola utilità incredibile. Per ubuntu basta apt-get install dos2unix. Se è necessario utilizzarlo in modo ricorsivo, fare riferimento a questa soluzione qui: stackoverflow.com/questions/11929461/… Lho eseguito follemente su ogni directory manualmente e ho pensato solo di cercare dopo il fatto.

Risposta

Questo ha funzionato per me

:e ++ff=dos 

Il comando: e ++ ff = dos dice a Vim di leggere di nuovo il file, forzando il formato del file dos. Vim rimuoverà le terminazioni di riga solo CRLF e LF, lasciando solo il testo di ogni riga nel buffer.

quindi

:set ff=unix 

e infine

:wq 

Commenti

  • grazie! questo ha funzionato per me, ma la soluzione accettata non
  • ff si riferisce al formato del file? Che dire di ++ff?
  • Il comando: e ++ ff = dos dice a Vim di leggere di nuovo il file, forzando il formato del file dos. Vim rimuoverà le terminazioni di riga solo CRLF e LF, lasciando solo il testo di ogni riga nel buffer.
  • Per informazioni su ff, esegui “: help ff ”
  • semplice ed efficace . Non sono sicuro del motivo per cui cat file1 > > file2 sta introducendo feed di riga dos quando il file 1 non ‘ ce lho al primo posto

Answer

La maggior parte dei sistemi operativi UNIX ha unutilità chiamata dos2unix che convertirà il CRLF in LF. Le altre risposte riguardano la domanda “cosa sono?”.

Risposta

Un altro modo per sbarazzarsi dei ritorni a capo è con il tr comando.

Ho un piccolo script simile a questo

#!/bin/sh tmpfile=$(mktemp) tr -d "\r" <"$1" >"$tmpfile" mv "$tmpfile" "$1" 

Risposta

Puoi risolvere questo problema con sed:

sed -e "s/^M$//" < infile > outfile 

Il trucco è come inserire correttamente il ritorno a capo. In genere, è necessario digitare C-v C-m per immettere un ritorno a capo letterale. Puoi anche fare in modo che sed funzioni con

sed -i.bak -e "s/^M$//" infile 

Answer

Sed in -place soluzione senza bisogno di digitare il carattere speciale (puoi copiarlo e funziona):

sed -i -e "s/\r//g" filename 

Spiegazione:

-i: in-place -e: regular expression \r: escaped carriage return /g: replace globally 

Commenti

  • Linterrogante stava già modificando il file con VIM, nota. E cè stata una risposta sul posto sed qui dal 2012.
  • Sì, ma mancava una buona soluzione funzionante. La soluzione sed esistente non ‘ funziona immediatamente.
  • Dale Hagglund ‘ è in -place sed decisamente funziona fuori dagli schemi.
  • Beh, non per me. ‘ m su Ubuntu LTS 18.04.
  • Questo mi ha aiutato a modificare un file su Alpine Linux da un desktop Windows che conterebbe Ctrl M come ritorno di riga, rendendo inefficaci le risposte precedenti.

Rispondi

Cosa è ^ M?
^ M è un carattere di ritorno a capo. Se vedi questo, probabilmente stai guardando un file che ha avuto origine nel mondo DOS / Windows, dove la fine della riga è contrassegnata da una coppia di ritorno a capo / nuova riga, mentre nel mondo Unix, la fine della riga è contrassegnato da una singola nuova riga.

Come può essere arrivato lì?
Quando cè è un cambiamento nel formato del file.

Come posso eliminarlo?
apri il tuo file con

vim -b FILE_PATH 

salvalo con il seguente comando

:%s/^M//g 

Commenti

  • Tu ‘ hai un errore di battitura in apri il tuo filr con .
  • Questa risposta non aggiunge nulla alle altre risposte. Il primo paragrafo è una copia quasi letterale della risposta accettata. Il codice fornito non salverà nulla, ma rimuoverà tutti i caratteri di ritorno a capo caratteri da tutte le righe E non sono sicuro di come sarà h. lapertura del file in modalità binaria elp qui.

Risposta

Nel mio caso,

Niente di cui sopra ha funzionato, ho aveva un file CSV copiato sulla 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 caratteri sono stati inseriti tra le righe in modo simile a quello riportato di seguito

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

Commenti

  • mac2unix -n inputfile outputfile o, equivalentemente, dos2unix -c mac -n inputfile outputfile gestirà quella situazione.

Risposta

Puoi utilizzare Vim in modalità Ex:

 ex -bsc "%s/\r//|x" file  
  1. -b modalità binaria

  2. % seleziona tutte le righe

  3. s substitute

  4. \r ritorno a capo

  5. x salva e chiudi

Answer

Aggiungi la seguente riga al tuo ~ / .vimrc

command! Tounix :call Preserve("1,$s/^M//") 

Quindi, quando hai un file con le terminazioni di riga di Windows, esegui il comando “: Tounix”.

Risposta

In passato, ho visto anche i file di configurazione non vengono analizzati correttamente e si lamentano degli spazi bianchi, ma se vi e fai un set list non mostrerà gli spazi, grep nomefile [[spazio]] ti mostrerà ^ M

che “s quando dos2unix file aiuta

Commenti

  • Questa risposta non porta nulla di nuovo, does2unix è già menzionato almeno in due risposte molto più antiche.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *