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 dannCtrl+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
, wobeiascii
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 gleichwertigdos2unix -c mac -n inputfile outputfile
behandelt diese Situation.
Antwort
Sie können Vim im Ex-Modus verwenden:
ex -bsc "%s/\r//|x" file
-
-b
Binärmodus -
%
Alle Zeilen auswählen -
s
Ersatz -
\r
Wagenrücklauf -
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.