'^ M' Zeichen am Zeilenende

99

Wenn ich ein bestimmtes SQL-Skript in Unix-Umgebungen ausführe, wird am Ende jeder Zeile des SQL-Skripts ein '^ M'-Zeichen angezeigt, das in der Befehlszeile wiedergegeben wird. Ich weiß nicht, auf welchem ​​Betriebssystem das SQL-Skript ursprünglich erstellt wurde.

Was verursacht das und wie behebe ich es?

Paul Reiners
quelle

Antworten:

79

Es wird durch die Zeilenendezeichen von DOS / Windows verursacht. Wie Andy Whitfield sagte, hilft der Unix-Befehl dos2unix, das Problem zu beheben. Wenn Sie weitere Informationen wünschen, können Sie die Manpages für diesen Befehl lesen.

Thomas Owens
quelle
3
Auf einigen Systemen (dh Ubuntu) lautet der Name dieses Befehls "fromdos"
bobwienholt
6
Sie können das Tool unter OSX sehr einfach erhalten, brew install dos2unixwenn Sie Homebrew installiert haben
Philipp
73

Korrigieren Sie die Zeilenenden, viindem Sie Folgendes ausführen :

:set fileformat=unix

:w

Tim Abell
quelle
2
Dies ist eine brillante Antwort. Danke vielmals. (gespeicherte Installation von dos2unix, ein Tool, das ich wahrscheinlich nur einmal verwenden würde)
Jamsi
3
Dies entfernt das ^Ms aus irgendeinem Grund nicht. Referenzdatei : /etc/timidity/fluidr3_gm.cfg.
Phil294
39

Die Ursache ist der Unterschied zwischen der Speicherung der Zeilenende-Markierungen durch ein Windows-basiertes Betriebssystem und ein Unix-basiertes Betriebssystem.

Windows-basierte Betriebssysteme speichern dank ihres DOS-Erbes ein Zeilenende als Zeichenpaar - 0x0D0A(Wagenrücklauf + Zeilenvorschub). Unix-basierte Betriebssysteme verwenden nur 0x0A(einen Zeilenvorschub ). Das, was ^MSie sehen, ist eine visuelle Darstellung von 0x0D(einem Wagenrücklauf ).

dos2unix hilft dabei. Sie müssen wahrscheinlich auch die Quelle der Skripte so anpassen, dass sie "Unix-freundlich" sind.

ColinYounger
quelle
Ich würde nicht sagen, dass aktuelle Windows-Versionen irgendeine Art von DOS- Erbe haben . Sie haben jedoch immer noch Kompatibilitätsbeschränkungen.
Joey
Dies ist der einfache Weg, wenn Sie ein automatisches Konvertierungswerkzeug ausführen. Danke
Pjl
Aber warum ^M? Warum das '^'? Warum das 'M'?
1737973
Weil es ein "Kontrollcharakter" ist. "^" ist die visuelle Darstellung des Klickens auf die Steuertaste. Unter den nur bestimmten Bytes stellt das ^ dar, wie der Editor sie darstellt.
Hejazzman
24

Der einfachste Weg ist zu verwenden vi. Ich weiß, das klingt schrecklich, ist aber einfach und in den meisten UNIX-Umgebungen bereits installiert. Das ^ M ist eine neue Zeile aus der Windows / DOS-Umgebung.

an der Eingabeaufforderung: $ vi filename

Drücken Sie dann " :", um in den Befehlsmodus zu gelangen.

Alles global suchen und ersetzen ist :%s/^M//g" Halten Sie die Steuerung gedrückt und drücken Sie dann V und dann M ", wodurch ^ M durch nichts ersetzt wird.

Zum Schreiben und Beenden geben Sie " :wq" Fertig!

Bernie Perez
quelle
Wie ersetze ich es in Emacs?
HerbertD
Vielen Dank! VI (M) ist großartig!
Ionică Bizău
3
Vielen Dank für die Erweiterung zum Eingeben des ^ M-Zeichens! Ich würde es stattdessen durch \ r ersetzen. Also tat ich:% s / ^ M / \ r / g
aharris88
13

Versuchen Sie, mit dos2unix das ^ M zu entfernen.

Andy Whitfield
quelle
10

In vi mache a :%s/^M//g

Um ^Mdie CTRLTaste zu halten , drücken Sie Vdann M(beide, während Sie die Steuertaste gedrückt halten) und das ^Mwird angezeigt. Dadurch werden alle Vorkommen gefunden und durch nichts ersetzt.

Dogbane
quelle
2
Um das ^ M durch einen Unix-freundlichen Zeilenumbruch zu ersetzen::%s/^M/\r/g
Gary Oak
8

Das SQL-Skript wurde ursprünglich unter einem Windows-Betriebssystem erstellt. Die '^ M'-Zeichen sind das Ergebnis von Windows und Unix, die unterschiedliche Vorstellungen darüber haben, was für ein Zeilenendezeichen verwendet werden soll. Sie können Perl in der Befehlszeile verwenden, um dies zu beheben.

perl -pie 's/\r//g' filename.txt
Bill die Eidechse
quelle
Sicher, Sie können Perl verwenden, aber würden Sie Perl über dos2unix vorschlagen?
Thomas Owens
2
Ich biete nur eine Alternative an, da bereits vier Personen gesagt haben, dass sie dos2unix verwenden sollen.
Bill the Lizard
2
Ja, ich fand das nützlich, weil ich auf einer rückwärts gerichteten Workstation in einem Büro mit einer prähistorischen IT-Abteilung arbeite. Außer ich habe eine Variation verwendet: perl -pi -e "s / \ x0D / \ n / g" file.csv
Rimian
7

Das ^ M wird normalerweise durch die Zeilenumbrüche des Windows-Operators verursacht und in Unix übersetzt sieht es wie ein ^ M aus. Der Befehl dos2unix sollte sie gut entfernen

dos2unix [Optionen] [-c Convmode] [-o Datei ...] [-n Infile Outfile ...]

jW.
quelle
5
C:\tmp\text>dos2unix hello.txt helloUNIX.txt

Sed ist noch weiter verbreitet und kann dies auch tun, wenn dos2unix nicht installiert ist

C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt  

Sie können auch versuchen, tr:

cat hello.txt | tr -d \r > helloUNIX2.txt  

Hier sind die Ergebnisse:

C:\tmp\text>dumphex hello.txt  
00000000h: 48 61 68 61 0D 0A 68 61 68 61 0D 0A 68 61 68 61 Haha..haha..haha  
00000010h: 0D 0A 0D 0A 68 61 68 61 0D 0A                   ....haha..  

C:\tmp\text>dumphex helloUNIX.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  

C:\tmp\text>dumphex helloUNIX2.txt  
00000000h: 48 61 68 61 0A 68 61 68 61 0A 68 61 68 61 0A 0A Haha.haha.haha..  
00000010h: 68 61 68 61 0A                                  haha.  
Alex Bolotov
quelle
4

Um ^ M Zeichen im vi-Editor zu ersetzen, verwenden Sie unten

Öffnen Sie die Textdatei und sagen Sie t1.txt

vi t1.txt

Rufen Sie den Befehlsmodus auf, indem Sie drücken shift + :

Drücken Sie dann die Tasten wie erwähnt %s/^M/\r/g

in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
Leela
quelle
Ihre letzte Zeile ist das, was mir in allen vorherigen Antworten gefehlt hat. Ich habe immer wieder keine Übereinstimmungen gefunden, weil ich Schicht + 6 gemacht habe, also habe ich getan, was jeder Hacker tun würde, und mein Missverständnis mit meiner eigenen Lösung umgangen: ein Makro aufzeichnen, um $ zu tun, um zum Ende jeder Zeile zu gelangen, und dann einfach x drücken Wiederholen Sie das Makro für die Anzahl der Zeilen in der Datei.
Darethas
3

Eine Alternative zum dos2unixBefehl wäre die Verwendung von Standarddienstprogrammen wie sed.

Zum Beispiel dos to unix:

sed 's/\r$//' dos.txt > unix.txt

Unix zu dos:

sed 's/$/\r/' unix.txt > dos.txt
g4
quelle
1

Sie können ^ M direkt mit dem Befehl sed aus den Dateien entfernen, z.

sed -i'.bak' s/\r//g *.*

Wenn Sie mit den Änderungen zufrieden sind, entfernen Sie die .bak-Dateien:

rm -v *.bak
Kenorb
quelle
0

od -a $file ist nützlich, um diese Art von Fragen unter Linux zu untersuchen (ähnlich wie oben bei dumphex).

Allan Wind
quelle
0

Wenn Sie in Perl die Variable $ / nicht festlegen und chomp () verwenden möchten, können Sie außerdem Folgendes tun:

$var =~ /\r\n//g;

Meine zwei Cent

Ariel Monaco
quelle
-1

Ein weiterer vi-Befehl, der ausreicht: :%s/.$// Dadurch wird das letzte Zeichen jeder Zeile in der Datei entfernt. Der Nachteil dieses Such- und Ersetzungsbefehls besteht darin, dass es ihm egal ist, was das letzte Zeichen ist. Rufen Sie es also nicht zweimal auf.

Scottie T.
quelle
Warum es erwähnen, wenn Sie wissen, dass es nicht zuverlässig ist?
Minexew