Shellscripte mit Windows / DOS Zeilenumbrüchen funktionieren leider nur eingeschränkt unter Linux. Die einfache Zeile „wget bla“ in einer Textdatei mit DOS Zeilenumbrüchen führt zu der Fehlermeldung das die Datei „bla%0D“ nicht gefunden wurde.
Dies entsteht da die Linux Zeilenumbrüche nur aus einem Zeilenumbruch-Zeichen (newline[\n]) bestehen. Unter DOS und Windows steht am ende jeder Zeile vor dem Zeilenumbruch-Zeichen noch ein Wagenrücklauf-Zeichen (carriage return [CR, \r, 0x0d}). (Merkhilfe für die Reihenfolge beim Zeilenumbruch return)
Ich habe mit mehrere Beispiele herausgesucht wie die Zeilenumbrüche korrigiert werden können.
Die Original Datei:
$ cat infile Hallo Tschues
Der Inhalt der Datei:
$ od -c infile 0000000 H a l l o \r \n T s c h u e s \r \n 0000020
Die mir bekannten Varianten die Zeilenumbrüche in der Datei zu korrigieren:
dos2unix (Der Standard weg um die Zeilenumbrüche umzuwandeln!)
$ cat infile |dos2unix |od -c 0000000 H a l l o \n T s c h u e s \n 0000016
Umwandlung mit Hilfe von sed (stream editor):
$ cat infile | sed 's/\r$//' | od -c 0000000 H a l l o \n T s c h u e s \n 0000016
Wenn es auch kein sed auf dem System geben sollte geht auch tr:
$ cat infile|tr -d '\r'|od -c 0000000 H a l l o \n T s c h u e s \n 0000016
oder awk:
$ cat infile| awk '{sub("\r$", ""); print}' | od -c 0000000 H a l l o \n T s c h u e s \n 0000016
und in Perl:
$ cat infile| perl -pe 's/\r//'|od -c 0000000 H a l l o \n T s c h u e s \n 0000016
im Editor vi und vim geht es mit folgender Eingabe:
:%s/\r//g
oder
:1,$ s/^M//
Es gibt noch viele weitere Möglichkeiten!
Ich freue mich über Deinen Kommentar, welche Möglichkeit Du gefunden hast die Zeilenumbrüche zu korrigieren!