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
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, comeThe 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
, quindiCtrl+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
conascii
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
-
-b
modalità binaria -
%
seleziona tutte le righe -
s
substitute -
\r
ritorno a capo -
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.
help digraph-table
.