Der Befehl tr, kurz für „translate“, übersetzt, löscht oder komprimiert Zeichen, die er von stdin liest. Gewöhnliche Eingabedateioperanden akzeptiert er nicht; stelle Daten daher über eine Pipe oder Eingabeumleitung bereit.
Text-Fu · Lektion 13
tr (Übersetzen)
Lerne, Zeichensätze in einem Standardeingabestrom zu übersetzen, zu löschen und zusammenzuziehen.
Die grundlegende Syntax lautet:
tr [OPTIONS] SET1 [SET2]
tr arbeitet mit Zeichensätzen statt mit Wörtern oder allgemeinen regulären Ausdrücken. Verwende ein anderes Werkzeug, wenn eine Umwandlung von vollständigen Wörtern, der Zeilenstruktur oder dem umgebenden Kontext abhängt.
Zeichen übersetzen
Bei zwei Sätzen werden Zeichen aus SET1 positionsgleich auf Zeichen aus SET2 abgebildet:
$ echo "hello world" | tr a-z A-Z
HELLO WORLD
Hier werden Positionen im Kleinbuchstabenbereich auf die entsprechenden Großbuchstaben abgebildet. Schütze Satzausdrücke durch Anführungszeichen, damit die Shell sie unverändert übergibt.
Du kannst auch einzelne Zeichen übersetzen:
$ echo "2026-06-23" | tr '-' '/'
2026/06/23
$ echo "abc123" | tr 'abc' 'ABC'
ABC123
Zeichen, die nicht in SET1 vorkommen, bleiben unverändert.
Was gibt printf '%s\n' 'abc123' | tr 'abc' 'ABC' aus?
Zeichen löschen
Mit -d und einem Satz entfernst du jedes passende Zeichen:
$ echo "My address is 123 Main Street" | tr -d '0-9'
My address is Main Street
Jede Ziffer wird unabhängig entfernt; tr erkennt dabei kein vollständiges Zahlentoken.
Zeichenklassen können von der aktuellen Locale definierte Gruppen beschreiben:
$ echo "Hello, world!" | tr -d '[:punct:]'
Hello world
Das Löschen von Zeilenumbrüchen verbindet Eingabezeilen, ohne ein Ersatztrennzeichen einzufügen:
$ printf "one\ntwo\nthree\n" | tr -d '\n'
onetwothree
:::single-choice{#tr-delete-digits} Welcher Befehl entfernt jede Ziffer aus stdin und lässt andere Zeichen unverändert?
::option[tr -d '[:digit:]']{#tr-delete-digit-class .correct explanation="Die Option -d löscht alle Zeichen der Ziffernklasse aus dem Eingabestrom."}
::option[tr -s '[:digit:]']{#tr-squeeze-digits explanation="Die Option -s komprimiert wiederholte Ziffern, lässt aber ein Zeichen jeder Folge bestehen."}
::option[tr '[:digit:]']{#tr-one-set-no-delete explanation="Für eine Übersetzung ist normalerweise ein zweiter Satz nötig. Ein Satz allein fordert keine Löschung an."}
:::
Wiederholte Zeichen komprimieren
Mit -s SET ersetzt du jede Folge eines aufgeführten Zeichens durch eine einzelne Instanz:
$ echo "Hello World, how are you?" | tr -s ' '
Hello World, how are you?
Dieser Satz enthält ein gewöhnliches Leerzeichen; Tabulatoren und Zeilenumbrüche werden von diesem Befehl nicht komprimiert.
Auch wiederholte Zeilenumbrüche lassen sich zusammenziehen:
$ printf "one\n\n\nTwo\n" | tr -s '\n'
one
Two
Welcher Befehl reduziert jede Folge gewöhnlicher Leerzeichen in stdin auf ein Leerzeichen?
Zeichenklassen und Komplemente verwenden
Zeichenklassen drücken die Absicht in vielen Locales deutlicher aus als selbst geschriebene Bereiche. Häufige Klassen sind:
[:lower:]: Kleinbuchstaben.[:upper:]: Großbuchstaben.[:digit:]: Ziffern.[:alpha:]: Buchstaben.[:alnum:]: Buchstaben und Ziffern.[:space:]: Leerraumzeichen.[:punct:]: Satzzeichen.
So wandelst du Klein- in Großbuchstaben um:
$ echo "linux journey" | tr '[:lower:]' '[:upper:]'
LINUX JOURNEY
Die Option -c bildet das Komplement von SET1, also alle nicht darin enthaltenen Zeichen. Zusammen mit -d kannst du nur bestimmte Zeichenarten bewahren:
$ echo "user@example.com!" | tr -cd '[:alnum:]'
userexamplecom
Auch der Zeilenumbruch wird entfernt, weil er nicht alphanumerisch ist. Ergänze oder bewahre Trennzeichen bewusst, wenn Datensatzgrenzen wichtig sind.
Was bewirkt tr -cd '[:alnum:]' mit stdin?
Stromtransformationen aufbauen
Mehrere tr-Prozesse lassen sich verbinden, wenn getrennte Schritte verständlicher sind:
$ echo "Hello,,, world!!!" | tr -d '[:punct:]' | tr -s ' '
Hello world
Bei einfachen tabulatorgetrennten Daten kannst du Tabulatoren in Kommas übersetzen:
$ printf "name\tlevel\npete\tbeginner\n" | tr '\t' ','
name,level
pete,beginner
Da tr stdin liest, kann eine Datei mit < bereitgestellt werden:
$ tr '[:lower:]' '[:upper:]' < names.txt
Leite stdout in eine andere Datei um, wenn du das Ergebnis speichern möchtest. Eine Umleitung zurück in den Eingabepfad würde ihn leeren, bevor tr ihn liest.
:::single-choice{#tr-read-file-input} Welcher Befehl lässt tr names.txt als stdin lesen und Kleinbuchstaben in Großbuchstaben umwandeln?
::option[tr names.txt '[:lower:]' '[:upper:]']{#tr-file-operand explanation="tr akzeptiert auf diese Weise keinen gewöhnlichen Eingabedateinamen; der zusätzliche Operand macht die Syntax ungültig."}
::option[tr -d '[:lower:]' < names.txt]{#tr-delete-lowercase explanation="Dieser Befehl liest die Datei richtig, löscht Kleinbuchstaben aber, statt sie zu übersetzen."}
::option[tr '[:lower:]' '[:upper:]' < names.txt]{#tr-input-redirection .correct explanation="Die Shell öffnet names.txt als stdin; tr bildet die Kleinbuchstabenklasse auf die Großbuchstabenklasse ab."}
:::
Mit dieser Übung kannst du zeichenweise Stromtransformationen praktisch trainieren:
- Linux tr Command: Character Translating – Transformiere mit
trZeichen in Textströmen, lösche bestimmte Zeichen, verwende Zeichenklassen und fasse Wiederholungen zusammen.
Lektion abgeschlossen
Sie haben tr (Übersetzen) abgeschlossen
Du kannst nun Zeichenströme mit gezielten tr-Operationen verändern.
Bilde Zeichen zwischen positionsgleichen Sätzen ab.
Lösche ausgewählte Zeichen mit
-d.Komprimiere Wiederholungen mit
-s.Verwende localeabhängige Klassen und Komplemente bewusst.
Stelle die Eingabe über stdin statt über einen Dateinamenoperanden bereit.
Lernfortschritt speichern
Erstellen Sie ein kostenloses Konto, um diese Lektion zu speichern und auf jedem Gerät weiterzulernen.
Kostenloses Konto erstellen