tr — Zeichen übersetzen, löschen und zusammenfassen

Praxis-Guide zu tr — Zeichen aus der Standardeingabe übersetzen, löschen oder zusammenfassen. Der Filter für zeichenweise Transformationen in Pipelines.

tr (translate) ist der Filter für zeichenweise Transformationen in der Shell – er liest von der Standardeingabe, ersetzt, löscht oder fasst einzelne Zeichen zusammen und schreibt das Ergebnis auf die Standardausgabe. Anders als sed arbeitet tr nicht mit Mustern, sondern mit Zeichenmengen: Du gibst eine Quell- und eine Zielmenge an, und tr bildet sie Zeichen für Zeichen aufeinander ab. Mit POSIX-Zeichenklassen wie [:upper:] oder [:digit:] deckst du ganze Gruppen ab, und mit -d, -s und -c löschst, verdichtest oder invertierst du die Auswahl. tr kennt keine Dateinamen – es lebt ausschließlich in der Pipe.

Zeichenübersetzung

tr '<set1>' '<set2>' — Ersetzt Zeichen aus set1 durch die entsprechenden Zeichen in set2.

echo 'hello' | tr 'aeiou' 'AEIOU'

tr 'a-z' 'A-Z' — Wandelt Kleinbuchstaben in Großbuchstaben um.

echo 'hello world' | tr 'a-z' 'A-Z'

tr 'A-Z' 'a-z' — Wandelt Großbuchstaben in Kleinbuchstaben um.

echo 'HELLO' | tr 'A-Z' 'a-z'

tr '[:lower:]' '[:upper:]' — Wandelt Klein- in Großbuchstaben über POSIX-Zeichenklassen um.

cat file.txt | tr '[:lower:]' '[:upper:]'

tr '<char>' '<char>' — Ersetzt ein einzelnes Zeichen durch ein anderes.

echo '2024/01/15' | tr '/' '-'

tr ' ' '\n' — Ersetzt Leerzeichen durch Zeilenumbrüche (ein Wort pro Zeile).

echo 'one two three' | tr ' ' '\n'

tr '\n' ' ' — Ersetzt Zeilenumbrüche durch Leerzeichen (verbindet Zeilen zu einer).

cat list.txt | tr '\n' ' '

tr ',' '\t' — Wandelt Kommas in Tabulatoren um (CSV zu TSV).

cat data.csv | tr ',' '\t' > data.tsv

tr '\t' ',' — Wandelt Tabulatoren in Kommas um (TSV zu CSV).

cat data.tsv | tr '\t' ',' > data.csv

Zeichen löschen

tr -d '<chars>' — Löscht alle Vorkommen der angegebenen Zeichen.

echo 'Hello, World!' | tr -d ',!'

tr -d '[:digit:]' — Entfernt alle Ziffern.

echo 'abc123def456' | tr -d '[:digit:]'

tr -d '[:alpha:]' — Entfernt alle Buchstaben (behält Ziffern, Satzzeichen usw.).

echo 'abc123def456' | tr -d '[:alpha:]'

tr -d '[:space:]' — Entfernt alle Leerraumzeichen (Leerzeichen, Tabs, Zeilenumbrüche).

echo '  hello   world  ' | tr -d '[:space:]'

tr -d '\n' — Entfernt alle Zeilenumbrüche (fügt alle Zeilen zusammen).

cat file.txt | tr -d '\n'

tr -d '\r' — Entfernt Wagenrückläufe (korrigiert Windows-Zeilenenden).

cat windows.txt | tr -d '\r' > unix.txt

tr -d '[:punct:]' — Entfernt alle Satzzeichen.

echo 'Hello, World! How are you?' | tr -d '[:punct:]'

Wiederholungen zusammenfassen

tr -s '<chars>' — Fasst wiederholte Zeichen zu einem einzigen zusammen.

echo 'heeello' | tr -s 'e'

tr -s ' ' — Reduziert mehrere Leerzeichen auf ein einzelnes.

echo 'too    many    spaces' | tr -s ' '

tr -s '\n' — Entfernt Leerzeilen (fasst aufeinanderfolgende Zeilenumbrüche zusammen).

cat file.txt | tr -s '\n'

tr -s '[:blank:]' — Fasst sämtlichen horizontalen Leerraum zusammen (Leerzeichen und Tabs).

cat messy.txt | tr -s '[:blank:]'

tr -s ' ' '\t' — Fasst mehrere Leerzeichen zusammen und wandelt sie in einen einzelnen Tabulator um.

ps aux | tr -s ' ' '\t'

Komplement

tr -cd '<chars>' — Löscht alle Zeichen AUSSER den angegebenen.

echo 'abc123def456' | tr -cd '[:digit:]\n'

tr -cd '[:alnum:]\n' — Behält nur alphanumerische Zeichen und Zeilenumbrüche.

echo 'Hello, World! #123' | tr -cd '[:alnum:]\n'

tr -cd '[:print:]' — Entfernt alle nicht druckbaren Zeichen.

cat binary-mixed.txt | tr -cd '[:print:]\n'

tr -c '[:alnum:]' '_' — Ersetzt alle nicht-alphanumerischen Zeichen durch Unterstriche.

echo 'Hello World! @2024' | tr -c '[:alnum:]\n' '_'

Zeichenklassen

[:alpha:] — Alle Buchstaben (a-z, A-Z).

tr -d '[:alpha:]'

[:digit:] — Alle Ziffern (0-9).

tr -d '[:digit:]'

[:alnum:] — Alle Buchstaben und Ziffern.

tr -cd '[:alnum:]'

[:upper:] / [:lower:] — Groß- / Kleinbuchstaben.

tr '[:upper:]' '[:lower:]'

[:space:] — Alle Leerraumzeichen (Leerzeichen, Tab, Zeilenumbruch usw.).

tr -d '[:space:]'

[:blank:] — Nur horizontaler Leerraum (Leerzeichen und Tab).

tr -s '[:blank:]'

[:punct:] — Alle Satzzeichen.

tr -d '[:punct:]'

[:print:] — Alle druckbaren Zeichen (inklusive Leerzeichen).

tr -cd '[:print:]'

Typische Anwendungsfälle

tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c <n> — Erzeugt eine zufällige alphanumerische Zeichenkette aus n Zeichen.

tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 32; echo

echo '<text>' | tr '[:upper:]' '[:lower:]' | tr ' ' '-' | tr -cd '[:alnum:]-' — Erzeugt aus einem Text einen URL-Slug.

echo 'Hello World Blog Post' | tr '[:upper:]' '[:lower:]' | tr ' ' '-'

cat <file> | tr -s ' ' '\n' | sort | uniq -c | sort -rn — Worthäufigkeit zählen: Wörter aufteilen, sortieren, zählen, nach Häufigkeit sortieren.

cat article.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | head -20

echo '<ROT13>' | tr 'A-Za-z' 'N-ZA-Mn-za-m' — Kodiert/dekodiert eine Zeichenkette per ROT13.

echo 'Hello World' | tr 'A-Za-z' 'N-ZA-Mn-za-m'

cat <file> | tr -cs '[:alpha:]' '\n' — Extrahiert nur Wörter (eines pro Zeile) und entfernt alle nicht-alphabetischen Zeichen.

cat mixed.txt | tr -cs '[:alpha:]' '\n'

Fazit

tr ist klein, schnell und überraschend vielseitig – ideal für Aufgaben wie Groß-/Kleinschreibung umwandeln, Windows-Zeilenenden bereinigen (tr -d '\r'), Whitespace verdichten oder Texte in Wortlisten zerlegen. Denk aber an seine Eigenheiten: tr ersetzt immer Zeichen für Zeichen, niemals ganze Zeichenketten – für mehrstellige Suchen-und-Ersetzen brauchst du sed. Die literalen \n und \t müssen im jeweiligen Argument stehen und werden von tr selbst interpretiert. Mit Multibyte-Zeichen (UTF-8) kommt tr nur eingeschränkt zurecht, weil es byteweise arbeitet; bei Umlauten und Sonderzeichen ist es daher nicht immer die richtige Wahl.

Verwandte Kommandos

  • sed – Stream-Editor für musterbasiertes Suchen und Ersetzen ganzer Zeichenketten
  • cut – Felder, Zeichen oder Byte-Bereiche aus Zeilen herausschneiden
  • paste – Zeilen mehrerer Dateien spaltenweise zusammenführen