[[: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}}