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?
sql
unix
newline
line-endings
os-dependent
Paul Reiners
quelle
quelle
brew install dos2unix
wenn Sie Homebrew installiert habenKorrigieren Sie die Zeilenenden,
vi
indem Sie Folgendes ausführen ::set fileformat=unix
:w
quelle
^M
s aus irgendeinem Grund nicht. Referenzdatei :/etc/timidity/fluidr3_gm.cfg
.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 nur0x0A
(einen Zeilenvorschub ). Das, was^M
Sie sehen, ist eine visuelle Darstellung von0x0D
(einem Wagenrücklauf ).dos2unix hilft dabei. Sie müssen wahrscheinlich auch die Quelle der Skripte so anpassen, dass sie "Unix-freundlich" sind.
quelle
^M
? Warum das '^'? Warum das 'M'?Der einfachste Weg ist zu verwenden
vi
.Ich weiß, das klingt schrecklich, ist abereinfach 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!quelle
Versuchen Sie, mit dos2unix das ^ M zu entfernen.
quelle
In vi mache a
:%s/^M//g
Um
^M
die CTRLTaste zu halten , drücken Sie Vdann M(beide, während Sie die Steuertaste gedrückt halten) und das^M
wird angezeigt. Dadurch werden alle Vorkommen gefunden und durch nichts ersetzt.quelle
:%s/^M/\r/g
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.
quelle
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 ...]
quelle
Sed ist noch weiter verbreitet und kann dies auch tun, wenn dos2unix nicht installiert ist
Sie können auch versuchen, tr:
Hier sind die Ergebnisse:
quelle
Um ^ M Zeichen im vi-Editor zu ersetzen, verwenden Sie unten
Öffnen Sie die Textdatei und sagen Sie 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
quelle
Eine Alternative zum
dos2unix
Befehl wäre die Verwendung von Standarddienstprogrammen wiesed
.Zum Beispiel dos to unix:
Unix zu dos:
quelle
Sie können ^ M direkt mit dem Befehl sed aus den Dateien entfernen, z.
Wenn Sie mit den Änderungen zufrieden sind, entfernen Sie die .bak-Dateien:
quelle
Konvertieren Sie DOS / Windows-Zeilenenden (\ r \ n) in Unix-Zeilenenden (\ n) mit tr:
Beitrag zum Ersetzen von Zeilenumbrüchen über die Unix-Befehlszeile
quelle
od -a $file
ist nützlich, um diese Art von Fragen unter Linux zu untersuchen (ähnlich wie oben bei dumphex).quelle
Wenn Sie in Perl die Variable $ / nicht festlegen und chomp () verwenden möchten, können Sie außerdem Folgendes tun:
Meine zwei Cent
quelle
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.quelle