[[:tux|{{ :linux.png?40|}}]]
===== tr: Translate Characters -> Syntax und Beispiele=====
Möchte man in Textdateien ein Zeichen gegen ein Anderes austauschen, eignet sich zB das tr-Kommando((http://www.unix.com/man-page/Linux/1/tr/)). Dabei können auch Steuerzeichen wie zB ein Carriage Return (Wagenrücklauf) entfernt werden, was vor allem dann nützlich ist, wenn Windows Textdateien in UNIX gelesen werden sollen.
Die Syntax des Aufrufes lautet: //tr [OPTION]... SET1 [SET2]//
**Beispiele:**\\
Einfaches austauschen. Das Kommando tr 'a' 'e' tauscht das Zeichen a gegen das Zeichen e aus:\\
$ echo banana | tr 'a' 'e'
benene
Natürlich kann tr auch aus Dateien lesen. Das Kommando tr 'a' 'e' < datei.txt ersetzt in datei.txt alle a gegen e und gibt das Ergebnis an der Standardausgabe aus:
$ cat datei.txt
Hans, Martin, Gustav, Simon, Thomas, Ernst, Annemarie, Sabine, Günter, Johann, Elke, Rainer
$ tr 'a' 'e' < datei.txt
Hens, Mertin, Gustev, Simon, Thomes, Ernst, Annemerie, Sebine, Günter, Johenn, Elke, Reiner
Soll die Ausgabe anstelle der Standardausgabe in eine neue Datei geschrieben werden, leiten wir die Ausgabe in eine neue Datei um.
$ tr 'a' 'e' < datei.txt > datei_neu.txt
$ cat datei_neu.txt (cr)
Hens, Mertin, Gustev, Simon, Thomes, Ernst, Annemerie, Sebine, Günter, Johenn, Elke, Reiner
Beim Ersetzen von Zeichen 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' '123' jeweils "a" durch "1", "b" durch "2" und "c" durch "3". Ist die zweite Zeichenkette kürzer als die erste, füllt tr die Lücke mit dem letzten Zeichen aus der zweiten Zeichenkette auf.
$ tr 'abc' '123' < datei.txt
H1ns, M1rtin, Gust1v, Simon, Thom1s, Ernst, Annem1rie, S12ine, Günter, Joh1nn, Elke, R1iner
Es lassen sich zB auch alle Kleinbuchstaben gegen Grossbuchstaben tauschen:
$ tr 'a-z' 'A-Z' < datei.txt
HANS, MARTIN, GUSTAV, SIMON, THOMAS, ERNST, ANNEMARIE, SABINE, GüNTER, JOHANN, ELKE, RAINER
Für Klein- und Grossbuchstaben gibt es auch vordefinierte Zeichenklassen -> [:lower:] und [:upper:]
$ tr [:lower:] [:upper:] < datei.txt
HANS, MARTIN, GUSTAV, SIMON, THOMAS, ERNST, ANNEMARIE, SABINE, GÜNTER, JOHANN, ELKE, RAINER
Mit dem Parameter -d lassen sich auch gezielt Zeichen löschen.
$ tr -d [:lower:] < datei.txt
H, M, G, S, T, E, A, S, G, J, E, R
Anders herum können Sie mit dem Parameter -c angeben, was **nicht** gelöscht werden soll.
$ tr -c -d 'A-Z' < datei.txt
HMGSTEASGJER
In dem Befehl zuvor wurde alles ausser die Grossbuchstaben entfernt, sogar das UNIX New Line Zeichen wurde bei der Ausgabe entfernt. Dieses können wir mit der Angabe von \n ebenfalls erhalten.
$ tr -c -d 'A-Z\n' < datei.txt
HMGSTEASGJER
Und dazu noch das Komma.
$ tr -c -d 'A-Z\n,' < datei.txt
H,M,G,S,T,E,A,S,G,J,E,R
Und auch noch das Leerzeichen.
$ tr -c -d 'A-Z\n, ' < datei.txt
H, M, G, S, T, E, A, S, G, J, E, R
Bei grossen Komma-separierten Textdateien wird die Ausgabe oft schwierig zu lesen oder schlecht weiter verarbeitbar. Wir können das Komma auch gegen ein New Line Zeichen \n austauschen.
$ tr ',' '\n' < datei.txt
Hans
Martin
Gustav
Simon
Thomas
Ernst
Annemarie
Sabine
Günter
Johann
Elke
Rainer
Jetzt haben wir aber noch das Leerzeichen vor den Namen. Um dieses zusätzlich noch zu entfernen, müssen wir den tr-Befehl mit sich selbst kombinieren. Im ersten Schritt werden die Leerzeichen entfernt und die Ausgabe ohne Leerzeichen wird erneut an tr weitergegeben.
$ tr -d ' ' < datei.txt | tr ',' '\n'
Hans
Martin
Gustav
Simon
Thomas
Ernst
Annemarie
Sabine
Günter
Johann
Elke
Rainer
Im Gegensatz zu UNIX, wo in ASCII Textdateien eine neue Zeile nur mit einem Line Feed Zeichen (\n) eingeleitet wird, werden unter Windows neue Zeilen zusätzlich noch mit einem Carriage Return (\r -> return -> Wagenrücklauf) eingeleitet. Das fürt oft zu Darstellungsproblemen, wenn man sich Windows Logdateien in UNIX anschauen möchte. Man kann diesens Return mit tr -d '\r' nun entfernen und in einer neuen Datei abspeichern.
$ tr -d '\r' < windows.txt > unix.txt
**Einschränkungen:**
Man kann zwar mehrere Zeichen durch eines ersetzen, wie zB in tr 'a-z' '1', was alle Kleinbuchstaben mit einer 1 ersetzt aber man kann nicht ein Zeichen durch mehrere ersetzen. Der Versuch einen Umlaut durch seine Digraphen (zB ae) zu ersetzen , wie zB im Kommando tr 'ä' 'ae', scheitert. Hierfür muss man zu anderen Methoden greifen, wie zB zum Einsatz von sed.
--- //pronto 2010/05/27 15:02//
{{keywords>translate characters linux debian osx mac}}