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:

  • tr liest stdin und schreibt stdout
  • tr akzeptiert kein Datei-Argument — Dateien werden mit < umgeleitet oder mit cat über eine Pipe geschickt
  • tr arbeitet zeichenweise, nicht stringweise
  • Für Mehr-Zeichen-Ersetzungen (Wort statt Buchstabe) ist sed das richtige Werkzeug
Bash Grundprinzip
echo "Hallo Welt" | tr 'a-z' 'A-Z'
Output
HALLO WELT

Syntax

tr kennt vier Grund-Modi, die durch das Vorhandensein von SET2 und die Flags -d, -s, -c gesteuert werden.

Bash
tr [OPTION] SET1 [SET2]
Modi
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.

NotationBedeutungBeispiel
abcEinzelne Zeichentr 'abc' 'xyz'
a-zBereich (lexikalisch)tr 'a-z' 'A-Z'
0-9Ziffern-Bereichtr -d '0-9'
[:alpha:]Alle Buchstaben (POSIX)tr -d '[:alpha:]'
[:digit:]Alle Zifferntr -d '[:digit:]'
[:upper:]Großbuchstabentr '[:upper:]' '[:lower:]'
[:lower:]Kleinbuchstabentr '[:lower:]' '[:upper:]'
[:space:]Whitespace (Space, Tab, Newline …)tr -s '[:space:]'
[:punct:]Satzzeichentr -d '[:punct:]'
[:alnum:]Buchstaben und Zifferntr -cd '[:alnum:]'
\n, \t, \rNewline, Tab, Carriage Returntr -d '\r'
\\, \', \"Backslash, Hochkommastr -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.

AufgabeBefehl
Klein- in Großbuchstabentr 'a-z' 'A-Z'
Klein- in Großbuchstaben (POSIX)tr '[:lower:]' '[:upper:]'
Newlines löschentr -d '\n'
Mehrfache Spaces zu einemtr -s ' '
ROT13-Verschlüsselungtr 'A-Za-z' 'N-ZA-Mn-za-m'
DOS-Zeilenumbrüche entfernentr -d '\r'
Alles außer Buchstaben/Newline löschentr -cd '[:alpha:]\n'
Nur Ziffern behaltentr -cd '0-9'
Tabs zu Spacestr '\t' ' '
Whitespace komplett entfernentr -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.

Bash ROT13 als Spielerei
echo "Hello World" | tr 'A-Za-z' 'N-ZA-Mn-za-m'
Output
Uryyb Jbeyq

Windows-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.

Bash DOS-Linebreaks killen
cat windows.txt | tr -d '\r' > unix.txt
Output
(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.

Bash Nur Ziffern aus einem String fischen
echo "Tel: +49 (30) 1234-5678" | tr -cd '0-9'
Output
493012345678
Bash Nur Buchstaben behalten
echo "Hallo, Welt 2026!" | tr -cd '[:alpha:]'
Output
HalloWelt

Wer 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.

Bash Was tr wirklich tut
echo "abcabc" | tr 'abc' 'xyz'
Output
xyzxyz

Das ist keine Wort-für-Wort-Ersetzung von „abc” zu „xyz”. Wer Strings ersetzen will, greift zu sed:

Bash Strings ersetzen — das ist sed-Gebiet
echo "abcabc" | sed 's/abc/xyz/g'
Output
xyzxyz

Im 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.

Bash Mehrfache a zusammenfassen
echo 'aaabbcc' | tr -s 'a'
Output
abbcc
Bash Whitespace normalisieren
echo "viel    Platz   dazwischen" | tr -s ' '
Output
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

/ Weiter

Zurück zu Textverarbeitung

Zur Übersicht