Das tr Kommando („translate”) ist ein kleines, aber mächtiges Werkzeug, das einzelne Zeichen übersetzt, löscht oder zusammenfasst. Anders als sed oder awk arbeitet tr nicht mit Wörtern oder Zeilen, sondern strikt zeichenweise — und liest immer von Standard Input, niemals direkt aus einer Datei.
Was tr macht
tr operiert auf einem Zeichenstrom: Jedes Eingabezeichen wird unabhängig betrachtet und nach festen Regeln umgeschrieben, gelöscht oder zusammengefasst. Es gibt keinerlei Verständnis von Wörtern, Zeilen oder Mustern — wer „abc” durch „xyz” ersetzt, ersetzt jedes a durch x, jedes b durch y und jedes c durch z, egal wo sie stehen.
Wichtig zu wissen:
trliest stdin und schreibt stdouttrakzeptiert kein Datei-Argument — Dateien werden mit<umgeleitet oder mitcatüber eine Pipe geschickttrarbeitet zeichenweise, nicht stringweise- Für Mehr-Zeichen-Ersetzungen (Wort statt Buchstabe) ist
seddas richtige Werkzeug
echo "Hallo Welt" | tr 'a-z' 'A-Z'HALLO WELTSyntax
tr kennt vier Grund-Modi, die durch das Vorhandensein von SET2 und die Flags -d, -s, -c gesteuert werden.
tr [OPTION] SET1 [SET2]tr SET1 SET2 Übersetzt jedes Zeichen aus SET1 in das entsprechende Zeichen an gleicher Position in SET2.
-d, --delete Löscht alle Zeichen aus SET1. SET2 entfällt.
-s, --squeeze-repeats Fasst aufeinanderfolgende Wiederholungen von Zeichen aus dem letzten SET zu einem einzigen Vorkommen zusammen.
-c, --complement Verwendet das Komplement von SET1 — also alle Zeichen, die nicht in SET1 stehen.
-t, --truncate-set1 Kürzt SET1 auf die Länge von SET2, wenn SET1 länger ist.
Sets und Klassen
Ein „Set” ist eine Beschreibung der Zeichen, auf die tr wirken soll. Sets können einzelne Zeichen, Bereiche, POSIX-Klassen und Escape-Sequenzen enthalten.
| Notation | Bedeutung | Beispiel |
|---|---|---|
abc | Einzelne Zeichen | tr 'abc' 'xyz' |
a-z | Bereich (lexikalisch) | tr 'a-z' 'A-Z' |
0-9 | Ziffern-Bereich | tr -d '0-9' |
[:alpha:] | Alle Buchstaben (POSIX) | tr -d '[:alpha:]' |
[:digit:] | Alle Ziffern | tr -d '[:digit:]' |
[:upper:] | Großbuchstaben | tr '[:upper:]' '[:lower:]' |
[:lower:] | Kleinbuchstaben | tr '[:lower:]' '[:upper:]' |
[:space:] | Whitespace (Space, Tab, Newline …) | tr -s '[:space:]' |
[:punct:] | Satzzeichen | tr -d '[:punct:]' |
[:alnum:] | Buchstaben und Ziffern | tr -cd '[:alnum:]' |
\n, \t, \r | Newline, Tab, Carriage Return | tr -d '\r' |
\\, \', \" | Backslash, Hochkommas | tr -d '\\' |
POSIX-Klassen müssen mit Klammern geschrieben werden: '[:alpha:]', nicht ':alpha:'. Das ist eine häufige Fehlerquelle.
Klassische Patterns
Eine Sammlung von tr-Einzeilern, die in jedem Shell-Cheatsheet stehen.
| Aufgabe | Befehl |
|---|---|
| Klein- in Großbuchstaben | tr 'a-z' 'A-Z' |
| Klein- in Großbuchstaben (POSIX) | tr '[:lower:]' '[:upper:]' |
| Newlines löschen | tr -d '\n' |
| Mehrfache Spaces zu einem | tr -s ' ' |
| ROT13-Verschlüsselung | tr 'A-Za-z' 'N-ZA-Mn-za-m' |
| DOS-Zeilenumbrüche entfernen | tr -d '\r' |
| Alles außer Buchstaben/Newline löschen | tr -cd '[:alpha:]\n' |
| Nur Ziffern behalten | tr -cd '0-9' |
| Tabs zu Spaces | tr '\t' ' ' |
| Whitespace komplett entfernen | tr -d '[:space:]' |
ROT13 ist die einzeilige Caesar-Verschlüsselung: Das erste Set listet alle Buchstaben in normaler Reihenfolge, das zweite zeigt die um 13 Positionen verschobenen Pendants. Weil 13 die halbe Alphabetlänge ist, ist die Operation ihre eigene Umkehrung — derselbe Befehl entschlüsselt wieder.
echo "Hello World" | tr 'A-Za-z' 'N-ZA-Mn-za-m'Uryyb JbeyqWindows-Textdateien nutzen \r\n als Zeilenende, Unix-Tools erwarten nur \n. Mit tr -d '\r' werden alle Carriage-Return-Bytes entfernt — der saubere One-Liner für „Datei in Unix-Format konvertieren”, ohne dos2unix installieren zu müssen.
cat windows.txt | tr -d '\r' > unix.txt(Datei ohne CR gespeichert)Das Komplement: -c
Mit -c wird das Set logisch invertiert — tr arbeitet dann auf allen Zeichen, die nicht in SET1 stehen. Besonders nützlich in Kombination mit -d, um nur eine ganz bestimmte Zeichenklasse zu behalten.
echo "Tel: +49 (30) 1234-5678" | tr -cd '0-9'493012345678echo "Hallo, Welt 2026!" | tr -cd '[:alpha:]'HalloWeltWer Newlines erhalten will, muss \n explizit ins SET aufnehmen: tr -cd '[:alpha:]\n'.
Limit: keine Multi-Char-Translations
tr ist kein Such-und-Ersetz-Werkzeug für Strings. Die Sets SET1 und SET2 werden zeichenweise paarweise zugeordnet — Position 1 zu Position 1, Position 2 zu Position 2 und so weiter.
echo "abcabc" | tr 'abc' 'xyz'xyzxyzDas ist keine Wort-für-Wort-Ersetzung von „abc” zu „xyz”. Wer Strings ersetzen will, greift zu sed:
echo "abcabc" | sed 's/abc/xyz/g'xyzxyzIm Mini-Beispiel sieht das Ergebnis identisch aus — der Unterschied wird klar, sobald die Zeichen in SET1 in unterschiedlicher Reihenfolge auftreten oder gar nicht zusammen vorkommen.
Squeeze: -s
Mit -s werden Folgen identischer Zeichen aus dem Set zu einem einzigen Zeichen zusammengefasst. Klassischer Use-Case: Whitespace normalisieren — mehrere Spaces, Tabs oder Newlines zu jeweils einem.
echo 'aaabbcc' | tr -s 'a'abbccecho "viel Platz dazwischen" | tr -s ' 'viel Platz dazwischen-s lässt sich mit -d und Übersetzung kombinieren: tr -s '[:space:]' ' ' ersetzt jeden Whitespace durch ein Space und reduziert dabei Wiederholungen.
Häufige Stolperfallen
tr akzeptiert kein Datei-Argument — immer Stdin verwenden.
Ein häufiger Anfängerfehler: tr ‘a’ ‘b’ file.txt schlägt fehl, weil tr die Datei als zweites SET interpretiert und sich beschwert. Korrekt ist tr ‘a’ ‘b’ < file.txt mit Eingabeumleitung oder cat file.txt | tr ‘a’ ‘b’ über eine Pipe. Das ist anders als bei cut, grep oder sed, die alle direkte Datei-Argumente akzeptieren — und genau diese Inkonsistenz sorgt regelmäßig für Verwirrung.
Locale beeinflusst [:upper:] und [:lower:] — Umlaute werden oft ignoriert.
Unter der C-Locale (Standard in vielen Skripten) erkennt [:upper:] nur ASCII-Großbuchstaben — Ä, Ö, Ü, ß werden nicht umgewandelt. Erst mit einer UTF-8-Locale wie de_DE.UTF-8 behandeln einige tr-Implementierungen Umlaute korrekt, andere wiederum nicht. Wer zuverlässig Umlaute mappen will, gibt sie explizit an: tr ‘äöüÄÖÜ’ ‘aouAOU’. Verlasse dich nie blind auf [:upper:] für deutschen Text.
GNU tr und BSD tr unterscheiden sich — vor allem bei macOS.
Auf Linux verwendest du GNU tr aus den Coreutils, auf macOS und FreeBSD die BSD-Variante. Die größten Unterschiede: BSD tr kennt nicht alle POSIX-Klassen so vollständig, akzeptiert manche Bereiche anders und behandelt das Padding von SET2 leicht abweichend. Wer portable Skripte schreiben will, testet auf beiden Plattformen — oder installiert GNU coreutils via Homebrew (brew install coreutils) und nutzt dann gtr.
POSIX-Klassen MIT Klammern schreiben — sonst wird der Doppelpunkt selbst gematcht.
tr -d ’[:digit:]’ löscht alle Ziffern. tr -d ‘:digit:’ dagegen löscht nur die Zeichen :, d, i, g, t — ein subtiler, aber häufiger Fehler. Die eckigen Klammern sind Teil des Klassen-Namens und müssen immer mitgeschrieben werden. In manchen Shells fühlt sich das doppelt verschachtelt an, ist aber Pflicht.
SET2 kürzer als SET1 — GNU paddet, BSD nicht.
Wenn SET1 mehr Zeichen enthält als SET2, padded GNU tr SET2 standardmäßig mit dem letzten Zeichen auf die Länge von SET1. tr ‘abc’ ‘X’ macht unter GNU also aus a, b und c jeweils ein X. BSD tr verhält sich anders und kann unerwartete Ergebnisse liefern. Lösung: SET2 explizit auf die richtige Länge bringen (‘XXX’) oder mit -t SET1 auf die Länge von SET2 kürzen.
Backslash-Sequenzen brauchen Single Quotes, sonst frisst die Shell.
Schreibst du tr -d “\r” in doppelten Hochkommas, kann die Shell den Backslash interpretieren — je nach Shell und Version mit unterschiedlichem Resultat. Verwende immer Single Quotes (tr -d ‘\r’), damit der Backslash unverändert an tr durchgereicht wird. Dasselbe gilt für ‘\n’, ‘\t’ und Co.
Weiterführende Ressourcen
Externe Quellen
- tr(1) – Linux manual page (man7.org) — offizielle Dokumentation aller tr-Optionen
- GNU Coreutils Manual: tr invocation — ausführliche Beschreibung im GNU-Handbuch mit Beispielen
- Arch Wiki: Core utilities — Übersicht über tr und verwandte Werkzeuge
Verwandte Artikel
- cut – Spalten und Felder extrahieren — Spalten und Felder aus Text ausschneiden
- sed – Stream Editor — String-Ersetzungen und Zeilen-Editing
- awk – Pattern-Verarbeitung — Felder und Berechnungen pro Zeile
- sort – Zeilen sortieren — Zeilen alphabetisch oder numerisch ordnen
- uniq – Duplikate behandeln — aufeinanderfolgende doppelte Zeilen zusammenfassen