'^M' - Zeichen am Ende der Zeilen
-
09-06-2019 - |
Frage
Wenn ich einen bestimmten SQL-Skript in Unix-Umgebungen, die ich bin zu sehen, ein "^M " - Zeichen am Ende jeder Zeile des SQL Skripts, wie es auch für die Befehl-Linie.Ich weiß nicht, auf welchem Betriebssystem Sie das SQL-Skript ursprünglich erstellt wurde.
Was verursacht das und wie kann ich es beheben?
Lösung
Sie wird verursacht durch das DOS - /Windows-Zeilenende-Zeichen.Wie Andy Whitfield sagte, den Unix-Befehl dos2unix wird helfen, das problem zu beheben.Wenn Sie weitere Informationen wünschen, Lesen Sie die man-Seiten für diesen Befehl.
Andere Tipps
Fix line endings in vi
durch ausführen der folgenden:
:set fileformat=unix
:w
Die Ursache ist der Unterschied zwischen dem, wie eine Windows-basierte OS und Unix-basierte OS-store die end-of-line-Marker.
Windows-basierte Betriebssysteme, die Dank Ihrer DOS-Erbe, store eine end-of-line als ein paar Zeichen - 0x0D0A
(carriage return + line feed).Unix-basierte Betriebssysteme einfach verwenden, 0x0A
(a line feed).Die ^M
Sie sehen eine visuelle Darstellung von 0x0D
(a carriage return).
dos2unix wird helfen, mit diesem.Sie haben wahrscheinlich auch anpassen müssen, um die Quelle des scripts werden von Unix-friendly.
Der einfachste Weg ist die Verwendung vi
. Ich weiß, das klingt schrecklich, aber seine einfache und bereits installierte auf den meisten UNIX-Umgebungen.Das ^M ist eine neue Linie von Windows - /DOS-Umgebung.
von der Eingabeaufforderung aus: $ vi filename
Dann drücken Sie ":
"zu Befehl Modus.
Suchen und Ersetzen Sie alle Weltweit :%s/^M//g
"Drücken und halten Sie control und drücken Sie dann V dann
M"die Stelle ^M nichts.
Dann zu schreiben und zu beenden, geben Sie ":wq
"Fertig!
Versuchen Sie es mit dos2unix ausziehen, den ^M.
In vi tun :%s/^M//g
, Um die ^M
halten Sie die STRG Schlüssel, drücken Sie V dann M (Sowohl beim halten der Strg-Taste) und die ^M
wird angezeigt.Diese findet alle vorkommen, und ersetzen Sie mit nichts.
Das SQL-Skript wurde ursprünglich auf einem Windows-Betriebssystem.Die '^M " - Zeichen sind ein Ergebnis von Windows-und Unix-verschiedene Vorstellungen darüber, was für ein end-of-line-Zeichen.Sie können perl auf der Kommandozeile, um dieses Problem zu beheben.
perl -pie 's/\r//g' filename.txt
Das ^M ist in der Regel verursacht durch die Windows-operator-Zeilenumbrüche enthalten, und übersetzt auf Unix-sieht aus wie ein ^M.Der Befehl dos2unix sollten, entfernen Sie diese schön
dos2unix [Optionen] [-c convmode] [-o file ...] [-n infile outfile ...]
C:\tmp\text>dos2unix hello.txt helloUNIX.txt
Sed ist noch überall erhältlich und Sie können tun, diese Art der Sache, auch wenn dos2unix ist nicht installiert
C:\tmp\text>sed s/\r// hello.txt > helloUNIX.txt
Sie könnten 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.
Zu ersetzen ^M-Zeichen im vi-editor unten
öffnen Sie die text-Datei sagen t1.txt
vi t1.txt
Geben Sie Befehl-Modus durch drücken shift + :
dann drücken Sie die Tasten wie erwähnt %s/^M/\r/g
in above ^M is not (shift + 6)M instead it is (ctrl + V)(ctrl + M)
Eine alternative zu dos2unix
Befehl würde mit standard-Dienstprogramme wie sed
.
Für Beispiel, dos zu unix:
sed 's/\r$//' dos.txt > unix.txt
unix zu dos:
sed 's/$/\r/' unix.txt > dos.txt
Sie können entfernen ^M aus direkt auf die Dateien über die sed-Befehl, z.B.:
sed -i'.bak' s/\r//g *.*
Wenn Sie mit den änderungen zufrieden sind, entfernen Sie die .bak-Dateien:
rm -v *.bak
Konvertieren von DOS - /Windows - ( ) Zeilenenden zu Unix ( ) Zeile enden, mit tr:
tr '\r\n' '\n' < dosFile.txt > unixFile.txt
Post zum ersetzen von Zeilenumbrüchen aus der Unix-Kommandozeile
od -a $file
sinnvoll ist zu erforschen, diese Art von Frage auf Linux (ähnlich dumphex im oben).
In Perl, wenn Sie nicht wollen, um die $/ Variablen und chomp() können Sie auch tun:
$var =~ /\r\n//g;
Meine zwei Cent
Ein weiterer vi-Befehl, tun wirst: :%s/.$//
Dies entfernt das Letzte Zeichen jeder Zeile in der Datei.Der Nachteil dieses suchen-und-ersetzen-Befehl ist, dass es egal ist, was das Letzte Zeichen ist, also seien Sie vorsichtig, nicht zu nennen es zweimal.