it-swarm-eu.dev

'^ M' Zeichen am Zeilenende

Wenn ich ein bestimmtes SQL-Skript in Unix-Umgebungen ausführe, wird am Ende jeder Zeile des SQL-Skripts ein '^ M' angezeigt, da es 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?

97
Paul Reiners

Dies wird durch die DOS/Windows-Zeilenendezeichen verursacht. Wie Andy Whitfield sagte, hilft der Unix-Befehl dos2unix, das Problem zu beheben. Wenn Sie weitere Informationen benötigen, können Sie die Manpages zu diesem Befehl lesen.

77
Thomas Owens

Korrigieren Sie die Zeilenenden in vi, indem Sie Folgendes ausführen:

:set fileformat=unix

:w

74
Tim Abell

Die Ursache ist der Unterschied, wie ein Windows-basiertes Betriebssystem und ein Unix-basiertes Betriebssystem die Zeilenende-Markierungen speichern.

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

dos2unix hilft dabei. Sie müssen wahrscheinlich auch die Quelle der Skripte anpassen, um "Unix-freundlich" zu sein.

39
ColinYounger

Am einfachsten ist es, vi zu verwenden. Ich weiß, das hört sich aber schrecklich an Es ist einfach und bereits auf den meisten UNIX-Umgebungen installiert. Das ^ M ist eine neue Zeile aus der Windows/DOS-Umgebung.

von der Eingabeaufforderung: $ vi filename

Dann drücken ": ", um in den Befehlsmodus zu gelangen.

Suchen und Ersetzen Sie alle global ist :%s/^M//g "Halten Sie die Taste gedrückt und drücken Sie dann V und dann M", wodurch ^ M durch nichts ersetzt wird.

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

24
Bernie Perez

Versuchen Sie, das ^ M mit dos2unix zu entfernen.

13
Andy Whitfield

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

Um das zu bekommen ^M halt die CTRL Tastendruck V dann M (Beide, während Sie die Steuertaste gedrückt halten) und das ^M wird auftauchen. Dies findet alle Vorkommen und ersetzt sie durch nichts.

9
dogbane

Das SQL-Skript wurde ursprünglich auf einem Windows-Betriebssystem erstellt. Die Zeichen '^ M' 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
8
Bill the Lizard

Das ^ M wird normalerweise durch die Windows-Operator-Zeilenumbrüche verursacht und auf Unix übersetzt sieht aus wie ein ^ M. Der Befehl dos2unix sollte sie schön entfernen

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

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

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

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.  
5
JGurtz

Verwenden Sie zum Ersetzen von ^ M-Zeichen im vi-Editor die nachstehenden Anweisungen

öffne die Textdatei say t1.txt

vi t1.txt

Aktivieren Sie den Befehlsmodus durch Drücken von 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)
4

Eine Alternative zum Befehl dos2unix Wäre die Verwendung von Standarddienstprogrammen wie sed.

Zum Beispiel dos to unix:

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

unix to dos:

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

Konvertieren Sie DOS/Windows (\ r\n) -Zeilenenden in Unix (\ n) -Zeilenenden mit tr:

tr '\r\n' '\n' < dosFile.txt > unixFile.txt

Beitrag zum Ersetzen von Zeilenumbrüchen über die Unix-Befehlszeile

1
Mason Wright

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
1
kenorb

Wenn Sie in Perl die Variable $/nicht setzen und chomp () verwenden möchten, können Sie auch Folgendes tun:

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

Meine zwei Cent

0
Ariel Monaco

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

0
Allan Wind