A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 9 Ω
Das Banner der Rhetos-Website: zwei griechische Denker betrachten ein physikalisches Universum um sie herum.

Bash tr

Programmieren

© 2016 - 2025




Basiswissen


Der Befehl tr löscht oder transkribiert einzelne Zeichen in einem Text. Die Abkürzung steht für "transliterate". Dazu stehen hier einige Beispiele.

tr mit einer pipe


Mit tr kann man einzelne Buchstaben oder irgendwelche Zeichen durch einzelne andere Zeichen ersetzen. Das ist die klassische Grundfunktion von tr:

echo hallo | tr a o

Zuerst schreibt der Befehl echo das Wort hallo. Das wird über eine Pipe (Durchleitung) mit dem senkrechten Strich | direkt an den Befehl tr weitergegeben. Der Befehl tr nimmt dann jedes a und ersetzt es durch ein o. Am Ende wird am Bildschirm das Wort "hollo" angezeigt. Zur Durchreichung von Inhalten mit dem senkrechten Strich siehe auch auch Bash pipe ↗

tr mit einem Redirect


Eine ähnliche Wirkung wie in dem Beispiel oben mit der Pipe mit dem senkrechten Strich | erreicht man auch durch ein sogenanntes Redirect mit dem Zeichen <. Ein redirect funktioniert jedoch nur mit Dateien. Man kann das kleiner-Zeichen hinter einen Befehl setzen und nennt dann den Namen einer Datei. Der Inhalt der Datei wird dann in die sogenannte Standardeingabe umgeleitet. Und Befehle wie etwa tr lesen zuerst, was in der Standardeingabe (stdin = standard input) steht:

tr a o < testdatei.txt

Wenn in der Datei testdatei.txt ein Text steht, wird jedes a in dem Text ersetzt durch ein o. Der so umgeschriebene Text wird dann am Bildschirm ausgegeben. Der Inhalt der testdatei.txt selbst wird aber nicht verändert.

tr mit doppeltem Redirect


Wie im Beispiel zuvor mit einem einfachen Redirect von rechts nach links über < (in Richtung Spitze), kann man die Ausgabe auch in eine weitere Datei umleiten, etwa ziel.txt:

tr a o < testdatei.txt > ziel.txt

Zuerst wird der Inhalt von testdatei.txt an tr übergeben. Der Befehl tr ersetzt dann alle kleinen Buchstaben a durch ein kleines o. Das Ergebnis davon wird letztendlich in die Datei ziel.txt geschrieben. Um deren Inhalt anzuzeigen, kann man zum Beispiel cat ziel.txt verwenden.

Optionen von tr


Wie die meisten Befehle unter Bash kann man auch tr mit verschiedenen sogenannten Optionen, das heißt Möglichkeiten, ausführen. Um die Option auszuwählen, fügt man nach dem Befehl ein Minuszeichen direkt gefolgt von einem Buchstaben für die entsprechende Option an. Dazu folgen jetzt einige Beispiele.

tr -d


Mit tr -d kann man einzelne Zeichen löschen. Das kleine d steht für delete, Englisch für löschen oder entfernen:

echo hallihallo | tr -d a

Hier wird am Ende das Wort hllihllo angezeigt. Alle kleinen a's wurden gelöscht. Um Leerzeichen zu löschen, schreibt man: echo hallihallo | tr -d ' '

tr -s


Mit der Option -s kann man hintereinander wiederholte Abfolgen eines Zeichen 'zusammenquetschen' (Englisch squeeze) auf nur ein Zeichen:

echo zoon politikon | tr -s o

Das Wort zoon politikon ist griechisch und heißt so viel wie soziales Tier. Damit ist in der Philosophie der Mensch gemeint, der sich vor allem durch seinen Drang zum Sozialen ausweist. Mit dem tr-Befehl wird hier das doppelte o auf nur ein o zusammengequetscht. Die Ausgabe ist also "zon politikon".

tr -c


Das kleine c steht für complement, was hier so viel wie das logische Gegenteil oder "alles andere als" bedeutet. Man erkennt die Wirkung am besten mit einem kurzen Beispiel:

echo Homo degeneratus | tr -c o i

Der Befehl bedeutet: ersetze jedes Zeichen das kein o ist durch ein i. Die dazu passende korrekte Ausgabe ist dann: ioioiiiiiiiiiiiii. Siehe mehr dazu unter Komplement ↗

Probleme, Tricks und Kniffe zu tr


Weil der Befehl tr so gut nachvollziehbar ist, kann man mit ihm sehr hilfreiche Konzepte von Bash kennen lernen, die auch mit anderen Befehlen oft die Arbeit enorm erleichter können. Einige sind jetzt kurz vorgestellt.

tr für Groß- und Kleinbuchstaben


Oft möchte man alle Großbuchstaben umwandeln in Kleinbuchstaben, oder umgekehrt. Beides geht mit tr auf einfach eWeise:

echo FitzGerald | tr [:upper:] [:lower:]
echo FitzGerald | tr [:lower:] [:upper:]

Die erste Zeile erzeugt fitzgerald. Die zweite Zeile gibt FITZGERALD.

tr und Zeichenklassen (character classes


Es gibt unter Bash fest definierte Klassen von Zeichen, etwa: alle Großbuchstaben oder alle Zahlen. Damit kann man Zeichen von einer Klasse umwandeln in Zeichen einer anderen Klasse:

echo RheinMetall | tr [:upper:] [:lower:]

In dem Beispiel wird in dem Namen des deutschen Rüstungskonzern Rheinmetall jeder groß geschriebene Buchstabe in einen klein geschriebenen Buchstaben umgewandelt. Erlaubte Zeichenklassen sind: "alnum", "alpha", "ascii", "blank", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper", "word" or "xdigit".[2]

tr für verborgenen Zeichen


Textdateien enthalten oft Zeichen, die von Editoren und Textbearbeitungsprogrammen nicht angezeigt werden werden. Man spricht von verborgenen Zeichen, im Englischen hidden characters oder auch Steuerzeichen. Solche verborgenen Zeichen markieren innerhalb einer Textdatei etwa, wo ein Zeilenumbrung oder ein Tabulator gesetzt werden sollen. Diese unsichtbaren Zeichen kann man in tr direkt ansprechen:

tr -d 'n' < testdatei.txt

Die Option -d sagt tr, dass alle versteckten Steuerzeichen der Art "n" gelöscht werden sollen. Das Steuerzeichen n steht für Newline und bewirkt einen Zeilenumbruch. Die mit einem redirect an tr übergebene Datei testdatei.txt hat am Ende also keine Zeilenumbrüche mehr. Der gesamte Text wird in einem durchgehenden Absatz dargestellt. Einige wichtige Steuerzeichen unter Bash sind:

  • " = double quote
  • \ = backslash
  • a = alert (BEL)
  • b = backspace
  • c = produce no further output
  • e = escape
  • f = form feed
  • n = new line
  • r = carriage return
  • t = horizontal tab
  • v = vertical tab

Ein wichtiger Hinweis zur Verwendung dieser Steuerzeichen ist, dass der Befehl echo unter Bash sie nicht zuverlässig benutzt. Speziell für die Benutzung dieser Steuerzeichen geschrieben wurde der Befehl Bash printf ↗

Grenzen und Alternativen zu tr


sed statt tr


Mit dem Befehl tr kann man immer nur einzelne Zeichen durch andere einzelne Zeichen ersetzen. Es ist mit tr nich t möglich, eine Gruppe von Zeichen, eine sogenannte Zeichenfolge, wie etwa das griechische Wort Hyle durch eine andere Zeichenfolge, wie etwa das deutsche Wort Urstoff zu ersetzen. Dazu verwendet man einen anderen Befehl:

echo Am Anfang gabe es nur Hyle. | sed 's/Hyle/Urstoff/g'

Hier erzeugt der Befehl sed die Ausgabe: Am Anfang gab es nur Urstoff. Der Befehl sed ist sehr viel umfangreicher als tr. Es gibt ganze Bücher, die sed beschreiben. Siehe mehr unter Bash sed ↗

String operators statt tr


Eine weitere Alternative sind die sogenannten String operators. Sie verändern nicht den Inhalt von Dateien oder Asgaben anderer Befehle sondern den Inhalt einer Variablen. String ist Englisch für Zeichenkette. String Operators verändern Zeichenketten, genau, wie tr, bearbeiten aber den Inhalt von Variablen. Betrachten wir ein kleines Beispiel:

g=9,88
echo ${g/88/81}

In der ersten Zeile hat die Variable g für die Erdfallbeschleunigung den (falschen) Wert 9,88 zugewiesen bekommen. In der zweiten Zeile wird der Inhalt von g mit echo ausgegeben. Aber in den geschwungenen Klammern wird gleichzeitig bestimmt, dass aus der Zeichenfolge 88 die Zeichenfolge 81 gemacht werden soll. Die endgültige Ausgabe ist also der für die Erde korrekte Mittelwert für die Erdfallbeschleunigung, nämlich 9,81. Mit den String operators lassen sich noch sehr viel mehr Veränderungen vornehmen. Viele nützliche Hinweise findet man dazu unter dem Stichwort "Pattern Matching". Siehe mehr dazu unter Bash string operators ↗

Reguläre Ausdrücke statt tr


Reguläre Ausdrücke steht nicht mehr für einen einzelnen Befehl, sondern für ein umfangreiches Paket an logischen Bauteilen zur komplexen Veränderungen Zeichenfolgen. Stelle dir vor, du möchtest in allen Dateien eines Lexikons, die in ihrem Namen die Zeichenfolge "welt" enthalten, im Inhalt dieser Dateien (es könnten hunderte sein) das Wort Welt ersetzen durch WELT. Die Ersetzung soll aber nur dann gemacht werden, wenn Welt als Wort alleine steht. In dem Wort Weltganzes soll es keine Veränderung geben. Aber im Satz "Als die Welt entstand, gab es noch kein Leben" soll Welt groß als WELT geschrieben werden. Das soll auch gemacht werden, wenn Welt am Anfang oder am Ende eines Satzes steht, also auf Welt zum Beispiel direkt ein Punkt folgt. Wie würdest du diese Aufgabe mit den dir im Moment bekannten Programmen für eine Textbearbeitung lösen? Mit Befehlen wie sed, tr, String Operators und in Verbindung mit regulären Ausdrücken kann die Aufgabe mit einer kurzen Programmierzeile in Sekundenschnelle gelöst werden. Siehe mehr unter Bash Regex ↗

Fußnoten


  • [1] String Operators sind ausführlich erklärt in: Cameron Newham, Bill Rosenblatt: Learning the bash Shell. O'Reilly Media Inc. 2005. ISBN: 978-0-596-00965-6. Dort im Kapitel "String Operators" ab Seite 91.
  • [2] Zeichenklassen sind ausführlich kurz in: Jeffrey E. F. Friedl: Reguläre Ausdrücke. Deutsch von Andreas Karrer. O'Reilly Media Inc. 1998. ISBN: 3-930673-62-2. Dort im "Kapitel 1. Erweiterung der Fundamente". Seite 29.