Che cos'è `^ M` e come posso liberarmene?


134

Quando apro il file vim, vedo strani ^Mpersonaggi.

Sfortunatamente, il motore di ricerca preferito del mondo non funziona bene con i caratteri speciali nelle query, quindi chiedo qui:

  • Che cos'è questo ^Mpersonaggio?

  • Come avrebbe potuto arrivarci?

  • Come posso liberarmene?


3
Vlastimil era una modifica inutile. Got è un vero passato di inglese britannico.
Jesse_b

1
E 'un digramma carattere di controllo, per maggiori informazioni: help digraph-table.
Eric Leschinski,

Risposte:


108

La ^Mè un carattere di ritorno. Se vedi questo, probabilmente stai guardando un file che ha avuto origine nel mondo DOS / Windows, in cui un fine riga è contrassegnato da una coppia di ritorno a capo / newline, mentre nel mondo Unix, fine riga è contrassegnato da un'unica riga.

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

In questo articolo viene illustrato come impostare vim per modificare in modo trasparente i file con diversi marker di fine riga.

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

:s/^M$//

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


11
Prova :%s/^M/\r/ginvece a rimuovere ^Me sostituire ^Mcon il carattere di nuova riga \r. Senza %, il comando si applica solo alla riga corrente. E mi sono imbattuto in alcuni esempi in cui ^Mnon è alla fine della linea, comeThe first line.^MThe second line.
George

O se non vuoi un sacco di interruzioni di linea, potresti semplicemente fare:%s/^M/
attentnow1,

2
Se è solo un ritorno a capo da solo, quella potrebbe essere la classica interruzione di riga Macintosh (pre-Unix). Anche alcuni programmi più recenti come Excel 2007 per Mac lo fanno per qualche motivo.
sudo,

@larsks Ma altap.cz/salamander/help/salamand/appendix_txtfiles afferma che ^Mviene utilizzato in UNIX
Vivek,

L'articolo a cui hai collegato dice che \nè usato in Unix, che è corretto. Questo è il codice ASCII 10, altrimenti noto come ^J.
Larsks,

39

La maggior parte dei sistemi operativi UNIX ha un'utilità chiamata dos2unixche converte CRLF in LF. Le altre risposte riguardano la domanda "cosa sono".


36

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

dos2unix filename

Questo comando funziona anche con i percorsi, ad es

dos2unix path/name*

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

dos2unix -c mac filename
  • -cImposta la modalità di conversione. Dove CONVMODE è uno di: ascii, 7bit, iso, maccon asciil'impostazione predefinita.

22

Questo ha funzionato per me

:e ++ff=dos 

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

poi

:set ff=unix 

e infine

:wq 

3
Grazie! questo ha funzionato per me, ma la soluzione accettata non ha funzionato
fan numero uno di Bjorks

Si ffriferisce al formato del file? Che dire ++ff?
KcFnMi,

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

10

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

Ho una piccola sceneggiatura simile a questa

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

6

Puoi ripulirlo con sed:

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

Il trucco è come inserire correttamente il ritorno a capo. In genere, è necessario digitare C-v C-mper inserire un ritorno a capo letterale. Puoi anche avere sed lavoro in atto con

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

2

Cos'è questo ^ M?
^ M è un carattere di ritorno a capo. Se vedi questo, probabilmente stai guardando un file che ha avuto origine nel mondo DOS / Windows, in cui un fine riga è contrassegnato da una coppia di ritorno a capo / newline, mentre nel mondo Unix, fine riga è contrassegnato da un'unica riga.

Come avrebbe potuto arrivarci?
Quando c'è un cambiamento nel formato del file.

Come posso liberarmene?
apri il tuo file con

vim -b FILE_PATH

salvalo con il seguente comando

:%s/^M//g

Hai un refuso ad aprire il tuo filr con .
Mateusz Piotrowski,

4
Questa risposta non aggiunge nulla alle altre risposte. Il primo paragrafo è una copia quasi integrale della risposta accettata. Il codice specificato non salverà nulla, ma rimuoverà tutti i caratteri di ritorno a capo da tutte le righe. E non sono sicuro di come l'apertura del file in modalità binaria possa aiutare qui.
Dubu,

2

Nel mio caso,

Niente sopra funzionava, avevo un file CSV copiato su una 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,

0

Puoi usare Vim in modalità Ex:

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

  2. % seleziona tutte le righe

  3. s sostituto

  4. \r ritorno a capo

  5. x salva e chiudi


0

Aggiungi la seguente riga al tuo ~ / .vimrc

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

Quindi, quando si dispone di un file con i finali di riga di Windows, eseguire il comando ": Tounix".


-1

In passato, ho visto che anche i file di configurazione non sono stati analizzati correttamente e si lamentano degli spazi bianchi, ma se vi e facendo un set list non mostrerà lo spazio bianco, il nome del file grep [[spazio]] vi mostrerà ^ M

ecco quando dos2unix fileaiuta


Questa risposta non porta nulla di nuovo, does2unix è già menzionato almeno in due risposte molto più vecchie.
Rui F Ribeiro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.