tr (Übersetzen)
100%

Text-Fu · Lektion 13

tr (Übersetzen)

Lerne, Zeichensätze in einem Standardeingabestrom zu übersetzen, zu löschen und zusammenzuziehen.

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.

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:

  1. Linux tr Command: Character Translating – Transformiere mit tr Zeichen 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
Nächste Lektion
Zurück zu Text-Fu