Was ist "^ M" und wie werde ich es los?


134

Beim Öffnen der Datei werden vimmerkwürdige ^MZeichen angezeigt .

Leider kommt die weltweit beliebteste Suchmaschine mit Sonderzeichen in Abfragen nicht gut zurecht. Deshalb frage ich hier:

  • Was ist das für ein ^MCharakter?

  • Wie konnte es dorthin gekommen sein?

  • Wie werde ich es los?


3
Vlastimil, das war ein sinnloser Schnitt. Got ist die Vergangenheitsform von Get in britischem Englisch.
Jesse_b

1
Es ist ein Steuerzeichen digraph, für weitere Informationen: help digraph-table.
Eric Leschinski

Antworten:


108

Das ^Mist ein Wagenrücklaufzeichen. Wenn Sie dies sehen, sehen Sie wahrscheinlich eine Datei, die aus der DOS / Windows-Welt stammt, in der ein Zeilenende durch ein Wagenrücklauf- / Zeilenumbruch-Paar gekennzeichnet ist, während in der Unix-Welt das Zeilenende wird durch einen einzelnen Zeilenumbruch markiert.

Lesen Sie diesen Artikel für mehr Details und auch den Wikipedia-Eintrag für Newline .

In diesem Artikel wird erläutert, wie Sie vim so einrichten, dass Dateien mit verschiedenen Zeilenende-Markierungen transparent bearbeitet werden.

Wenn Sie eine Datei mit ^Mam Ende einiger Zeilen haben und diese entfernen möchten, verwenden Sie dies in Vim:

:s/^M$//

(Drücken Sie Ctrl+ V Ctrl+ M, um das einzufügen ^M.)


11
Versuchen Sie :%s/^M/\r/gstattdessen, ^Mdas ^MZeichen zu entfernen und durch ein Newline-Zeichen zu ersetzen \r. Ohne %gilt der Befehl nur für die aktuelle Zeile. Und ich kam über einige Beispiele , bei denen ^Mnicht am Ende der Zeile ist, wieThe first line.^MThe second line.
George

Oder wenn Sie nicht viele Zeilenumbrüche möchten, können Sie dies einfach tun:%s/^M/
vorsichtig,

2
Wenn es nur ein Zeilenumbruch für sich ist, ist dies möglicherweise der klassische (vor Unix) Macintosh-Zeilenumbruch. Sogar einige neuere Programme wie Excel 2007 für Mac tun dies aus irgendeinem Grund.
Sudo

@larsks Aber altap.cz/salamander/help/salamand/appendix_txtfiles sagt, dass ^Min UNIX verwendet wird
Vivek

Der Artikel, auf den Sie verlinkt haben, besagt, dass \nin Unix verwendet wird, was korrekt ist. Das ist ASCII-Code 10, auch bekannt als ^J.
Larsks

39

Die meisten UNIX-Betriebssysteme haben ein Hilfsprogramm dos2unix, das die CRLF in LF konvertiert. Die anderen Antworten beziehen sich auf die Frage "Was sind sie".


36

Eine einfachere Möglichkeit besteht darin, den folgenden Befehl zu verwenden:

dos2unix filename

Dieser Befehl funktioniert auch mit Pfadmustern, z

dos2unix path/name*

Wenn es nicht funktioniert, versuchen Sie es mit einem anderen Modus:

dos2unix -c mac filename
  • -cStellen Sie den Konvertierungsmodus ein. Wobei CONVMODE eine der folgenden ist: ascii, 7bit, iso, macwobei CONVMODE asciidie Standardeinstellung ist.

22

Das hat bei mir funktioniert

:e ++ff=dos 

Der Befehl: e ++ ff = dos weist Vim an, die Datei erneut zu lesen und das DOS-Dateiformat zu erzwingen. Vim entfernt nur CRLF- und LF-Zeilenenden und belässt nur den Text jeder Zeile im Puffer.

dann

:set ff=unix 

und schlussendlich

:wq 

3
Vielen Dank! das hat bei mir funktioniert, aber die akzeptierte Lösung hat nicht funktioniert
Bjorks Nummer eins Fan

Does ffverweist Format einzureichen? Was ist ++ff?
KcFnMi

Der Befehl: e ++ ff = dos weist Vim an, die Datei erneut zu lesen und das DOS-Dateiformat zu erzwingen. Vim entfernt nur CRLF- und LF-Zeilenenden und belässt nur den Text jeder Zeile im Puffer.
Stryker

10

Eine andere Möglichkeit, Zeilenumbrüche zu entfernen, ist der trBefehl.

Ich habe ein kleines Skript, das so aussieht

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

6

Sie können dies aufräumen mit sed:

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

Der Trick ist, wie man den Wagenrücklauf richtig eingibt. Im Allgemeinen müssen Sie C-v C-meingeben, um einen wörtlichen Wagenrücklauf einzugeben. Sie können auch die Arbeit an Ort und Stelle mit haben

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

2

Was ist das ^ M?
Das ^ M ist ein Wagenrücklaufzeichen. Wenn Sie dies sehen, sehen Sie wahrscheinlich eine Datei, die aus der DOS / Windows-Welt stammt, in der ein Zeilenende durch ein Wagenrücklauf- / Zeilenumbruch-Paar gekennzeichnet ist, während in der Unix-Welt das Zeilenende wird durch einen einzelnen Zeilenumbruch markiert.

Wie konnte es dorthin gekommen sein?
Wenn sich das Dateiformat ändert.

Wie werde ich es los?
öffne deine Datei mit

vim -b FILE_PATH

Speichern Sie es mit folgendem Befehl

:%s/^M//g

Du hast einen Tippfehler beim Öffnen deiner Datei mit .
Mateusz Piotrowski

4
Diese Antwort fügt den anderen Antworten nichts hinzu. Der erste Absatz ist eine fast wörtliche Kopie der akzeptierten Antwort. Der angegebene Code nicht speichern alles, aber nur entfernen Sie alle Zeilenumbrüche aus allen Linien. Und ich bin nicht sicher, wie das Öffnen der Datei im Binärmodus hier helfen wird.
Dubu

2

In meinem Fall,

Nichts oben hat funktioniert, ich hatte eine CSV-Datei von meinem Mac auf den Linux-Rechner kopiert und ich habe alle oben genannten Befehle verwendet, aber nichts hat geholfen, außer den folgenden

tr "\015" "\n" < inputfile > outputfile

Ich hatte eine Datei, in der ^ M Zeichen zwischen Zeilen zwischengeschaltet waren

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

0

Sie können Vim im Ex-Modus verwenden:

ex -bsc '%s/\r//|x' file
  1. -b Binärmodus

  2. % Wählen Sie alle Zeilen aus

  3. s Ersatz

  4. \r Wagenrücklauf

  5. x speichern und schließen


0

Fügen Sie Ihrem ~ / .vimrc die folgende Zeile hinzu

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

Wenn Sie eine Datei mit den Windows-Zeilenenden haben, führen Sie den Befehl ": Tounix" aus.


-1

In der Vergangenheit habe ich selbst gesehen, dass Konfigurationsdateien nicht richtig analysiert werden und sich über Whitespace beschweren, aber wenn Sie vi und eine Set-Liste ausführen, wird das Whitespace nicht angezeigt. Grep filename [[Leerzeichen]] zeigt Ihnen ^ M

Dann dos2unix filehilft es


Diese Antwort bringt nichts Neues, does2unix ist zumindest in zwei wesentlich älteren Antworten bereits erwähnt.
Rui F Ribeiro
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.