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

Wenn ich die Datei in Vim öffne, werden seltsame ^M Zeichen angezeigt.

Leider funktioniert die weltweit beliebteste Suchmaschine nicht gut mit Sonderzeichen in Abfragen, daher frage ich hier:

  • Was ist das ^M Zeichen?

  • Wie könnte es dort hingekommen sein?

  • Wie werde ich es los?

Kommentare

  • Es ist ‚ ein Steuerzeichen-Digraph, für mehr info: help digraph-table.
  • VS-Code verfügt unten über eine EOL-Option, mit der eine geöffnete Datei automatisch konvertiert wird.
  • @StackUnderflow bei Verwendung VSCode, das Ändern der Zeilenenden in LF bei der Arbeit an Linux-Dateien hilft. Ich benutze WSL … Eine Windows-Datei wie $ profile hat kein Problem mit der Linux-Datei, die LF beendet. Vielleicht schlägt Win hier Linux.

Antwort

Die ^M ist ein Wagenrücklaufzeichen. Wenn Sie dies sehen, sehen Sie sich wahrscheinlich eine Datei an, 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 weitere Details und auch den Wikipedia-Eintrag für newline .

In diesem Artikel wird erläutert, wie Sie vim so einrichten, dass Dateien mit unterschiedlichen Endpunkten transparent bearbeitet werden. of-line-Markierungen.

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

:s/^M$// 

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

Kommentare

  • Versuchen Sie :%s/^M/\r/g entfernen stattdessen ^M und ersetzen ^M durch das Zeilenumbruchzeichen . Ohne % gilt der Befehl nur für die aktuelle Zeile. Und ich bin auf einige Beispiele gestoßen, bei denen ^M nicht am Zeilenende steht, wie z. B. The first line.^MThe second line.
  • oder wenn Sie ‚ Sie möchten nicht viele Zeilenumbrüche. Sie können einfach :%s/^M/
  • ausführen, wenn es ist nur ein Wagenrücklauf für sich, das könnte der klassische (vor Unix) Macintosh-Zeilenumbruch sein. Sogar einige neuere Programme wie Excel 2007 für Mac tun dies aus irgendeinem Grund.
  • @larsks Aber altap.cz/salamander/help/salamand/appendix_txtfiles sagt, dass ^M unter UNIX verwendet wird
  • Nicht sicher, ob ‚ etwas in meiner vim-Konfiguration ist. Aber ich muss Ctrl+Q und dann Ctrl+M eingeben, damit dieses Zeichen generiert wird!

Antwort

Eine einfachere Möglichkeit hierfür ist die Verwendung des folgenden Befehls:

dos2unix filename 

Dieser Befehl funktioniert auch mit Pfadmustern, z. B.

dos2unix path/name* 

Wenn er nicht funktioniert, verwenden Sie einen anderen Modus:

dos2unix -c mac filename 
  • -c Festlegen des Konvertierungsmodus. Dabei ist CONVMODE einer der folgenden Werte: ascii, 7bit, iso, mac, wobei ascii die Standardeinstellung ist.

Kommentare

  • +1 für die Erwähnung des Standardwerts des Flags -c und anderer Optionen. Beim ersten Versuch hatte die Standardeinstellung ‚ nicht die erwarteten Ergebnisse. Mit dos2unix -c max hat es funktioniert. dos2unix: converting file launch_me.sh to Unix format...
  • Erstaunlich kleines Dienstprogramm. Für Ubuntu nur apt-get install dos2unix. Wenn Sie es rekursiv verwenden müssen, können Sie hier auf diese Lösung verweisen: stackoverflow.com/questions/11929461/… Ich habe es törichterweise manuell in jedem Verzeichnis ausgeführt und nur daran gedacht, nachzuschauen.

Antwort

Dies funktionierte bei mir

:e ++ff=dos 

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

dann

:set ff=unix 

und schließlich

:wq 

Kommentare

  • danke! Dies hat bei mir funktioniert, aber die akzeptierte Lösung hat nicht
  • Bezieht sich ff auf das Dateiformat? Was ist mit ++ff?
  • Der Befehl: e ++ ff = dos weist Vim an, die Datei erneut zu lesen, wodurch das dos-Dateiformat erzwungen wird. Vim entfernt nur CRLF- und LF-Zeilenenden und lässt nur den Text jeder Zeile im Puffer.
  • Um mehr über ff zu erfahren, führen Sie “ aus: help ff “
  • einfach und effektiv . Ich bin nicht sicher, warum cat file1 > > file2 Dos-Zeilenvorschübe einführt, wenn Datei 1 nicht ‚ Ich habe es überhaupt nicht

Antwort

Die meisten UNIX-Betriebssysteme haben ein Dienstprogramm namens dos2unix konvertiert die CRLF in LF. Die anderen Antworten beziehen sich auf die Frage „Was sind sie?“.

Antwort

Eine andere Möglichkeit, Wagenrückläufe loszuwerden, ist die tr Befehl.

Ich habe ein kleines Skript, das so aussieht

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

Antwort

Sie können dies mit sed:

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

Der Trick besteht darin, den Wagenrücklauf richtig einzugeben. Im Allgemeinen müssen Sie C-v C-m eingeben, um einen wörtlichen Wagenrücklauf einzugeben. Sie können die Arbeit auch mit

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

Antwort

Sed in -place-Lösung, ohne das Sonderzeichen eingeben zu müssen (Sie können dies kopieren und es funktioniert):

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

Erläuterung:

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

Kommentare

  • Der Fragesteller hat die Datei bereits mit VIM bearbeitet. Und seit 2012 gibt es hier eine direkte Antwort sed.
  • Ja, aber es fehlte eine gute, funktionierende Lösung. Die vorhandene sed-Lösung ‚ funktioniert nicht sofort.
  • Dale Hagglund ‚ ist in -place sed Auf jeden Fall funktioniert sofort .
  • Nun, nicht für mich. Ich ‚ bin unter Ubuntu LTS 18.04.
  • Dies hat mir geholfen, eine Datei unter Alpine Linux von einem Windows-Desktop aus zu bearbeiten, bei der Strg + M als Zeilenrückgabe gezählt wird. Die obigen Antworten werden unwirksam.

Antwort

Was ist das ^ M?
Das ^ M ist ein Wagenrücklaufzeichen. Wenn Sie dies sehen, sehen Sie sich wahrscheinlich eine Datei an, 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 könnte es dort hingekommen sein?
Wenn dort ist eine Änderung des Dateiformats.

Wie werde ich es los?
Öffnen Sie Ihre Datei mit

vim -b FILE_PATH 

Speichern Sie sie mit dem folgenden Befehl

:%s/^M//g 

Kommentare

  • Sie ‚ haben einen Tippfehler in Öffnen Sie Ihren Filter mit .
  • Diese Antwort fügt den anderen Antworten nichts hinzu. Der erste Absatz ist eine fast wörtliche Kopie der akzeptierten Antwort. Der angegebene Code speichert nichts, sondern entfernt nur alle Wagenrückläufe Zeichen aus allen Zeilen. Und ich bin nicht sicher, wie das Öffnen der Datei im Binärmodus h wird elp hier.

Antwort

In meinem Fall

hat nichts oben funktioniert, ich Ich hatte eine CSV-Datei von meinem Mac auf einen Linux-Computer kopiert und alle oben genannten Befehle verwendet, aber nichts half außer dem folgenden.

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

Ich hatte eine Datei, in der ^ M Zeichen wurden zwischen den folgenden Zeilen geschaltet:

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

Kommentare

  • mac2unix -n inputfile outputfile oder gleichwertig dos2unix -c mac -n inputfile outputfile behandelt diese Situation.

Antwort

Sie können Vim im Ex-Modus verwenden:

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

  2. % Alle Zeilen auswählen

  3. s Ersatz

  4. \r Wagenrücklauf

  5. x Speichern und Schließen

Antwort

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

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

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

Antwort

In der Vergangenheit habe ich gesehen, dass selbst Konfigurationsdateien nicht richtig analysiert wurden und sich über Leerzeichen beschweren, aber wenn Sie vi und machen Sie eine Set-Liste, bei der das Leerzeichen nicht angezeigt wird. Der Grep-Dateiname [[Leerzeichen]] zeigt Ihnen ^ M

, wenn dos2unix file hilft

Kommentare

  • Diese Antwort bringt nichts Neues, Does2unix wird bereits mindestens in zwei Antworten erwähnt, die viel älter sind.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.