Headerbild: eoln2unix – Textdateien ins Unix-Format konvertieren

eoln2unix – Textdateien ins Unix-Format konvertieren


Bereits im Artikel „Dateikonvertierung unix2dos und dos2unix“ haben wir uns mit der Konvertierung von systemspezifischen Zeilenendungen befasst. Wenn man genau weiß, welche Zeilenendung eine Datei verwendet, sind die vorgestellten Skripten sehr nützlich. Häufig haben wir jedoch den Fall, Textdateien von unbekannten Systemen zu erhalten. Es wäre also praktisch, wenn wir ein Skript hätten, welches uns automatisch die erhaltene Textdatei in das Unix-Format wandeln kann, unabhängig davon, welche Zeilenendung in der Originaldatei verwendet wird. Ein solches Skript eoln2unix wollen wir in diesem Workshop entwickeln. Das Skript soll selbst erkennen, welches Zeilenendeformat vorliegt und dieses gegebenenfalls wandeln.

Zeilenendeformate

Sehen wir uns zuerst an, welche Zeilenendeformate wir überhaupt vorfinden können, die wir in unserem Skript erkennen müssen:

  • LF wird von Unix-Systemen verwendet, also auch von Gnu/Linux und macOS bzw. OS X, wie es bis vor Kurzem noch hieß.
  • CRLF wird von DOS bzw. Windows-Systemen verwendet.
  • CR wurde ehedem vom Mac-Rechnern benutzt, bevor sich Apple zu Unix bekannte.
  • LFCR könnte zumindest theoretisch vorkommen, auch wenn ich kein System kenne, welches diese Zeilenendung verwendet.

Jetzt stellt sich nur noch die Frage, wie wir die Zeilenenden erkennen. Dazu bietet sich das file-Kommando an.

Auf eine DOS-/Windows-Textdatei angewendet, meldet es beispielsweise:

Auf die gleiche Datei im Unix-Format angesetzt, sieht das Ganze so aus:

Wer merkt etwas? – Nun, der interessante Teil des Ergebnisses ist der, der mit „with“ beginnt. Danach steht, in Leerzeichen eingeschlossen, die erkannte Zeilenendung. Bei Unix-Dateien schweigt das file-Kommando. Die Idee ist also, eine ausgewiesene Dateiendung zu extrahieren und dann fallweise, je nach Dateiendung, eine Konvertierung vorzunehmen.

Skript zur Zeilenendeerkennung

Schreiben wir uns ein kleines Test-Skript, um die erkannten Zeilenendungen auszugeben:

Das Skript benutzt das sed-Kommando, um die Ausgabe von file zu filetieren. Wir entfernen alle Zeichen bis zu einem möglichen „with“, inklusive des folgenden Leerzeichens. Sodann wird alles weggeschnitten, was einer eventuell vorhandenen Zeilenendekennung folgt. Wenn eine Zeilenendekennung ausgegeben wurde, bleibt diese übrig und wird der Variablen eoln_type zugewiesen. Diese geben wir dann einfach aus.

Zeilenenden manuell konvertieren

Im Grunde sind die erforderlichen Operationen ganz einfach. Nehmen wir beispielsweise eine DOS-/Windows-Datei. Dann wandelt das folgende Kommando die Zeilenenden nach Unix um:

Selbiges erreichen wir natürlich auch mit

Wir löschen einfach das CR (Carriage Return) aus der Zeichenfolge CRLF , welches durch '\r' symbolisiert wird. Das LF (Line Feed) bleibt erhalten. Die Datei ist im Unix-Formt. Das gleiche Kommando funktioniert, wenn wir eine Datei bekommen, die die Zeilenenden mit LFCR markiert. – Welches System auch immer das tun mag.

Bei Mac-Dateien müssen wir '\r' durch '\n' ersetzen. Das Schema ist das gleiche.

Wir erkennen: Das Prinzip ist einfach.

eoln2unix – automatische Konvertierung von Zeilenenden

Die eigentliche Arbeit besteht darin, das Ganze in ein halbwegs stabiles Shell-Skript zu verpacken. Das folgende Skript zeigt eine mögliche Lösung. Es verwendet das getopt-Kommando, um mögliche Kommandozeilenoptionen zu verarbeiten. Das Kommando ist bitte nicht mit dem Builtin getopts der Bash zu verwechseln. Ich habe das Builtin absichtlich nicht verwendet, um das Skript möglichst einfach und kompatibel zu halten, auch wenn getopts über mehr Fähigkeiten verfügt.

Dank der Kommentare kann ich mir weitere Erläuterungen sparen. Der größte Aufwand besteht darin, das Skript angenehm in der Nutzung zu gestalten. Man kann damit mehrere Dateien, unabhängig von ihrem Typ, ins Unix-Format wandeln. Weil das Skript nur auf der Standardausgabe ausgibt, kann das Resultat via Ausgabeumlenkung nur in einer gemeinsamen Datei gesammelt werden.

Verbesserungen

Nur auf die Standardausgabe ausgeben zu können, ist ersteinmal eine Einschränkung. Es steht jedoch jedem frei, eine weitere Option zu realisieren, die es ermöglicht, jede Datei direkt zu konvertieren, also die ursprüngliche Eingabedatei zu überschreiben. Alternativ kann man sich natürlich auch des Skriptes overwrite, welches im UNIX-Werkzeugkasten vorgestellt wird, bedienen.

Nehmen wir an, wir hätte mehrere DOS-/Windows-Dateien namens dos1 bis dos6, so könnten wir diese in einer Rutsche mittels

konvertieren. Das Skript muss also nicht zwingend erweitert werden. Es ist auch in dieser einfachen Form schon sehr nützlich und bequem zu verwenden!

Karsten Brodmann

Karsten Brodmann

Karsten Brodmann hat an der Universität Osnabrück BWL/Wirtschaftsinformatik studiert. Er hat viele Jahre in der IT gearbeitet und dort Web- und Datenbankanwendungen entwickelt. Seit Gründung der Punkt-Akademie veröffentlicht Karsten Brodmann auch Schulungsvideos zur Datenbankentwicklung, Unix und Programmierung bei Udemy. In seiner Freizeit fotografiert Karsten Brodmann gerne. Seit vielen Jahren fotografiert er analog und digital. Dabei behält er jeweils den gesamten Workflow in der eigenen Hand, von der Aufnahme über die Dunkelkammer oder auch den Scanner sowie die Bildbearbeitung und den Ausdruck am PC.

Weitere Beiträge

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert