Kategorien
Linux Windows

Textdateien mit Windows & DOS Zeilenumbrüchen für Linux korrigieren

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!