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?

Christoph Wurm
quelle
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.)

larsks
quelle
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".

Aaron Brown
quelle
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.
AnonGeek
quelle
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 
Stryker
quelle
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"
Johan
quelle
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
Dale Hagglund
quelle
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
Prashant Kanse
quelle
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,
Vishwanath gowda k
quelle
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

Steven Penny
quelle
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.

Charlie Dalsass
quelle
-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

Sriram
quelle
Diese Antwort bringt nichts Neues, does2unix ist zumindest in zwei wesentlich älteren Antworten bereits erwähnt.
Rui F Ribeiro