tr: Translate Characters -> Syntax und Beispiele

Möchte man in Textdateien ein Zeichen gegen ein Anderes austauschen, eignet sich zB das tr-Kommando1). 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

tux/tr.txt (17065 views) · Zuletzt geändert: 2012/02/27 14:18 von wikisysop
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0