Das Programm “tr” ist ein wahrer Zauberkünstler: Mit diesem Befehl tauschen Sie Zeichenketten in Textdateien aus. Ob es um das Ersetzen einzelner Buchstaben und Ziffern geht oder um das Zusammenschrumpfen mehrerer Leerzeichen – “tr” gibt sich vielseitig.
Zu Befehl
Auch wenn sich viele Dinge bequem über grafische Oberflächen wie KDE oder Gnome regeln lassen – wer sein Linux-System richtig ausreizen möchte, kommt um die Kommandozeile nicht herum. Abgesehen davon gibt es auch sonst viele Situationen, in denen es gut ist, sich im Befehlszeilendschungel ein wenig auszukennen.
Das Kommando tr dient dazu, in Texten einzelne Zeichen durch andere zu ersetzen. Das Kommando erhält seinen Input aus der Standardeingabe und schreibt das Ergebnis auf die Standardausgabe. Sie können aber beides mit den bekannten Operatoren auch umleiten. Gerade im Einsatz zusammen mit anderen Shell-Befehlen zeigt tr seine ganze Stärke und sorgt für zauberhafte Verwandlungen.
Einfach nur tauschen
Der Befehle tr nimmt zwei Zeichenketten als Argumente entgegen und ersetzt in Texten alle Zeichen des ersten Arguments durch das entsprechende Zeichen des zweiten. Was zunächst kompliziert klingt, kann man sich anhand eines einfachen Beispiels schnell vor Augen führen. Der folgende Aufruf ersetzt im Wort “Petronella” alle “e” durch “a”:
$ echo Petronella | tr 'e' 'a' Patronalla
Natürlich können Sie auch in einer Datei selbst bestimmte Zeichenketten austauschen. Das Kommando tr '1' '2' < test.txt ersetzt in der Datei test.txt alle Vorkommen von “1” durch eine “2” und leitet den Output an die Standardausgabe. Dabei sollten Sie beachten, dass in den Argumenten, die Sie übergeben, die Zeichen wie in Feldern angeordnet sind: Jedem Zeichen aus dem ersten Argument wird sein entsprechender Gegenpart aus dem zweiten Argument zugeordnet. So ersetzt tr 'abc' 'xyz' jeweils “a” durch “x”, “b” durch “y” und “c” durch “z”. Ist die zweite Zeichenkette kürzer als die erste, füllt tr die Lücke mit dem letzten Zeichen aus der zweiten Zeichenkette auf.
So stellt der Aufruf tr 'abc' 'z' < test.txt keinerlei Problem dar. Hier ersetzt tr alle Vorkommen von “a”, “b” und “c” jeweils durch “z”. Hingegen scheitert tr bei dem Versuch, “ä” durch “ae” zu ersetzen: Die Felder sind nicht gleichlang, und “ä” wird hier nur gegen “a” getauscht. Wer einen derartigen Tauschvorgang anstoßen möchte, nimmt besser das Programm sed[1] zu Hilfe.
Aus Groß mach Klein
Als besonders praktisch erweist sich der Einsatz von tr, wenn es darum geht, Groß- und Kleinbuchstaben miteinander zu vertauschen. Dabei können Sie natürlich die beiden Argumente gleich als ganze Listen von Feldern definieren, z. B.:
tr 'a-z' 'A-Z' < test.txt
Alternativ setzen Sie vordefinierte Zeichenklassen ein und schreiben:
tr [:lower:] [:upper:] < test.txt
Alles außer…
Der Befehl tr kennt einige Parameter, mit denen Sie noch gezielter tauschen können. Beispielsweise lässt sich durch Einsatz von -d gezielt etwas löschen:
tr -d '0-9' < test.txt
schickt beispielsweise alle Ziffern eines Textes ins Nirvana. Zusammen mit der Option -c können Sie Überflüssiges noch gezielter entfernen. Soll alles außer Leerzeichen, Groß- und Kleinbuchstaben verschwinden, sagen Sie tr über die Option -c, was nicht gelöscht werden soll:
tr -c -d 'A-Z a-z' < test.txt
Zusammen mit der Option -s lassen Sie Texte zusammenschrumpfen – praktisch, wenn eine Datei (z. B. ein Logfile) jede Menge Leerzeichen enthält. Der Parameter -s erwartet entweder ein oder zwei Argumente. So löscht das Kommando tr -s ' ' < test.txt alle Spaces aus einer Datei heraus. Wer hingegen einfach nur doppelte Leerzeichen oder Tabs entfernen und gegen einen einfachen Blank tauschen möchte, gibt tr und der Option -s einfach zwei Argumente mit auf den Weg:
tr -s [:blank:] ' ' < test.txt
Hier tauscht tr mehrere Leerzeichen oder Tabs hintereinander durch einfache Spaces aus.
Wanderer zwischen den Welten
Wer häufiger Textdateien zwischen Windows- und Linux-Systemen austauscht, stellt spätestens beim Benutzern eines Editors fest, dass seltsame Zeichen am Zeilenende auftauchen. Öffnen Sie etwa eine unter Windows erstellte ASCII-Datei im Editor Vim, erscheinen wie von Geisterhand ^M-Zeichen (Abbildung 1). Des Rätsels Lösung: Die beiden Systeme nutzen eine unterschiedliche Kennzeichnung für Zeilenenden. Während unter Windows der Zeilenumbruch durch \r\n repräsentiert wird, fällt bei Linux das \r weg; ein \n genügt.
Um ASCII-Dateien zwischen den beiden Systemen auszutauschen, können Sie wiederum tr einsetzen. Der Aufruf
tr -d '\r' < wintext > linuxtext
entfernt die zusätzlichen \r am Zeilenende und konvertiert so die Textdatei. Dabei sorgt der Parameter -d dafür, dass das genannte Zeichen verschwindet. Danach liest das Kommando durch den Operator < die Datei wintext ein und schreibt schließlich die Ausgabe mit > in die “gesäuberte” Datei linuxtext.
Alternative Konvertierungskünstler
Ebenso leicht funktioniert das Hin- und Herkonvertieren zwischen Linux und Windows mit den beiden Programmen dos2unix und unix2dos. Die Ziffer “2” im Namen steht dabei jeweils für “to” (wie englisch “two”) – die Befehle heißen also ausgesprochen “DOS to Unix” und “Unix to DOS”. Um eine Windows-Textdatei für Linux fit zu machen, genügt der Aufruf:
$ dos2unix -n wintext linuxtext dos2unix: converting file wintext to file linuxtext in UNIX format …
Zum Einsatz kommt hier der Parameter -n. Er sorgt dafür, dass Sie neben der Eingabedatei auch die neue Ausgabedatei angeben können. Die Manpage verrät weitere nützliche Tipps und Tricks: Die Option -k erhält die ursprünglichen Zeitstempel, -o schreibt alle die Änderungen direkt in die Originaldatei. Mit unix2dos geht es auf die gleiche Weise in die andere Richtung:
unix2dos -n linuxtext wintext
Auf einigen Systemen bilden die beiden Helfer symbolische Links zu den Programmen fromdos respektive todos. Die Programme weisen eine leicht abweichende Syntax und andere Parameter auf. Hier sollten Sie beispielsweise die Option -b nutzen, die für ein Backup der Originaldatei sorgt, auch wenn Sie nicht in eine neue Datei umleiten. Merken Sie sich am Besten auch den Parameter -a, der bei fromdos alle Carriage Returns entfernt (und nicht nur die, welche einem Line Feed vorangehen). Verwenden Sie die Option -a beim Befehl todos, konvertiert sie alle Line Feeds in CR-LF-Paare. Standard wäre dagegen, nur jene Line Feeds zu ersetzen, die noch kein Carriage Return vorweg besitzen.
Die beiden Befehle für dos2unix und unix2dos aus dem vorangehenden Beispiel können also z. B. so aussehen:
cat wintext | fromdos -a > linuxtext cat linuxtext | todos -a > wintext
Gut kombiniert
Seine ganze Stärke spielt tr in Kombination mit anderen Kommandos auf der Shell aus. Finden sich beispielsweise jede Menge Dateien mit Leerzeichen im Namen auf Ihrer Platte, und Sie möchten diese Blanks gerne in Unterstriche ändern, dann erledigen Sie das schnell mit einer for-Schleife, dem Befehl mv und tr:
$ for i in *; do mv -v "$i" `echo $i | tr ' ' '_'`; done `datei mit leerzeichen' -> `datei_mit_leerzeichen' `datei mit leerzeichen 2' -> `datei_mit_leerzeichen_2'
Im Klartext übersetzt heißt das: Für alle Dateien im aktuellen Verzeichnis mache Folgendes: Verschiebe diese für den Benutzer sichtbar in Dateien, deren Namen das Ergebnis der tr-Tauschaktion sind.
Glossar
-
Zeilenumbruch
-
Die Syntax für Zeilenumbrüche auf dem Computer wurde der Funktionsweise von Schreibmaschinen nachempfunden. Es gibt ein Steuerzeichen für den Zeilenvorschub (engl. “Line Feed”) und eines für den Wagenrücklauf (engl. “Carriage Return”). Auf den verschiedenen Betriebssystemen sind die Zeilenumbrüche unterschiedlich definiert: Während unter Linux ein schlichtes Line Feed (\n = “new line”) den Umbruch markiert, sieht DOS/Windows zusätzlich ein Carriage Return (\r = “return”) vor.
Infos
[1] Artikel zu sed: Heike Jurzik, “Ersetz Dich!”, LinuxUser 11/2002, S. 80 ff., http://www.linux-user.de/ausgabe/2002/11/080-sed/





