• Allgemein
  • Bash tr-Befehl: Zeichen suchen, ersetzen und löschen

Bash tr-Befehl: Zeichen suchen, ersetzen und löschen

Syntax und Verwendung des tr-Befehls

Der tr-Befehl in Bash ist ein vielseitiges Tool zur Zeichenmanipulation, mit dem du Zeichen in einem Textstrom suchen, ersetzen oder löschen kannst. Seine Syntax ist wie folgt:

tr [OPTIONEN] SET1 SET2

SET1: Zeichenfolge zu suchen

  • SET1 ist eine Zeichenfolge, die die Zeichen angibt, die gesucht werden sollen.
  • Du kannst einzelne Zeichen, Zeichenbereiche oder Zeichenklassen verwenden.

SET2: Zeichenfolge zum Ersetzen oder Löschen

  • SET2 ist eine Zeichenfolge, die die Zeichen angibt, die als Ersatz für die gefunden Zeichen verwendet werden sollen.
  • Wenn SET2 leer ist, werden die gefundenen Zeichen gelöscht.

Optionen

Der tr-Befehl unterstützt verschiedene Optionen zur Anpassung seines Verhaltens:

  • -d: Löscht die Zeichen aus SET1 aus der Eingabe, anstatt sie zu ersetzen.
  • -s: Komprimiert aufeinanderfolgende Instanzen von Zeichen aus SET1 auf ein einzelnes Auftreten.
  • -c: Komplementiert den Suchvorgang und ersetzt alle Zeichen außer denen aus SET1.
  • -v: Invertiert den Suchvorgang und ersetzt alle Zeichen aus SET1.

Verwendung

Um den tr-Befehl zu verwenden, gib ihn einfach in der Befehlszeile gefolgt von den entsprechenden SETs und Optionen ein. Beispielsweise sucht und ersetzt der folgende Befehl alle Vorkommen des Zeichens "a" durch "b" in der Datei "input.txt":

tr "a" "b" < input.txt

Du kannst auch reguläre Ausdrücke verwenden, um komplexere Zeichenmanipulationen durchzuführen. Weitere Informationen zu regulären Ausdrücken und ihrer Verwendung mit tr findest du im Abschnitt "Zeichensequenzen und Klassen".

Optionen zur Zeichensubstitution

Um Zeichen innerhalb eines Textes zu ersetzen, bietet der tr-Befehl dir mehrere Optionen:

Einfache Substitution

Mit der einfachsten Option kannst du ein einzelnes Zeichen durch ein anderes ersetzen. Die Syntax ist wie folgt:

tr "altes_zeichen" "neues_zeichen"

Beispiel:

echo 'Änderungen anwenden' | tr 'ä' 'ae'
Aenderungen anwenden

Bereichssubstitution

Du kannst auch Zeichen innerhalb eines Bereichs durch ein anderes Zeichen ersetzen. Die Syntax ist wie folgt:

tr -s "startzeichen-endzeichen" "ersetzungszeichen"

Beispiel:

echo 'ABCDEFG' | tr -s 'A-C' 'a'
abcDEFG

Einbuchstabensubstitution

Für eine schnellere und einfachere Substitution kannst du Einbuchstabensubstitutionen verwenden. Die Syntax ist wie folgt:

tr -c "alten_zeichen" "ersetzungszeichen"

Diese Option ersetzt alle Zeichen, die nicht in der Zeichenfolge "alten_zeichen" enthalten sind, durch "ersetzungszeichen".

Beispiel:

echo '123abcDEF' | tr -c '0-9' 'X'
X123XabcXFX

Zeichen löschen

Um ein Zeichen aus einem Text zu löschen, kannst du die Option -d verwenden. Die Syntax ist wie folgt:

tr -d "zu_löschende_zeichen"

Beispiel:

echo 'Hallo Welt' | tr -d ' '
HalloWelt

Verwendung von Bereichswerten

Der tr-Befehl bietet dir die Möglichkeit, ganze Bereiche von Zeichen durch andere Zeichen zu ersetzen. Dabei hast du die Wahl, ob du den Bereich durch einen Start- und Endpunkt oder durch einen Einzelwert angibst.

Bereich durch Start- und Endpunkt

Um einen Bereich durch seinen Start- und Endpunkt anzugeben, verwendest du folgende Syntax:

tr [OPTIONEN] STARTZEICHEN-ENDZEICHEN ERSATZZEICHEN

Beispiel:

tr [a-z] [A-Z]

Dieser Befehl konvertiert alle Kleinbuchstaben im Bereich a-z in ihre Großbuchstaben A-Z.

Bereich durch Einzelwert

Du kannst auch einen Bereich durch einen einzelnen Zeichenwert angeben. In diesem Fall ersetzt der tr-Befehl alle Vorkommen dieses Zeichens durch das angegebene Ersatzzeichen.

Syntax:

tr [OPTIONEN] ZEICHEN ERSATZZEICHEN

Beispiel:

tr a A

Dieser Befehl ersetzt alle Kleinbuchstaben a durch Großbuchstaben A.

Komplementierende Bereiche

Wenn du alle Zeichen ersetzen möchtest, die nicht zu einem bestimmten Bereich gehören, kannst du den -c-Schalter verwenden.

Syntax:

tr -c [OPTIONEN] STARTZEICHEN-ENDZEICHEN ERSATZZEICHEN

Beispiel:

tr -c a-z A

Dieser Befehl ersetzt alle Zeichen außer Kleinbuchstaben durch den Großbuchstaben A.

Hinweis für optionale Leerzeichen

Beachte, dass Leerzeichen nach den Bereichs- und Ersatzzeichen optional sind. Du kannst sie verwenden, um die Lesbarkeit zu verbessern, aber sie sind nicht erforderlich.

Zeichensequenzen und Klassen

Neben der Ersetzung einzelner Zeichen kannst du mit dem tr-Befehl auch Zeichensequenzen und Klassen ersetzen.

Zeichensequenzen

Eine Zeichensequenz ist eine Folge von zwei oder mehr Zeichen, die als Einheit behandelt werden. Um eine Zeichensequenz zu ersetzen, verwendest du die folgenden Schritte:

  1. Schließe die Zeichensequenz in eckige Klammern ein.
  2. Ersetze die Sequenz durch das gewünschte Zeichen.
  3. Verwende die -s-Option, um mehrere aufeinanderfolgende Vorkommen der Zeichensequenz durch ein einzelnes Zeichen zu ersetzen.

Beispiel:

tr -s "[aeiou]" "*" < text.txt

Dieser Befehl ersetzt alle Vokale im Text in der Datei text.txt durch Sternchen.

Zeichenklassen

Zeichenklassen sind vordefinierte Gruppen von Zeichen, die du bei Ersetzungen verwenden kannst. Die folgenden Zeichenklassen stehen zur Verfügung:

  • [:alnum:] – Alphabetische und numerische Zeichen
  • [:alpha:] – Alphabetische Zeichen
  • [:blank:] – Leerzeichen und Tabulatoren
  • [:cntrl:] – Steuerzeichen
  • [:digit:] – Ziffern
  • [:graph:] – Grafische Zeichen (nicht Leerzeichen und Steuerzeichen)
  • [:lower:] – Kleinbuchstaben
  • [:print:] – Druckbare Zeichen (nicht Leerzeichen und Steuerzeichen)
  • [:punct:] – Satzzeichen
  • [:space:] – Leerzeichen
  • [:upper:] – Großbuchstaben
  • [:xdigit:] – Hexadezimale Ziffern

Um eine Zeichenklasse zu ersetzen, verwendest du die folgenden Schritte:

  1. Schließe die Zeichenklasse in eckige Klammern ein.
  2. Ersetze die Zeichenklasse durch das gewünschte Zeichen.
  3. Verwende die -s-Option, um mehrere aufeinanderfolgende Vorkommen der Zeichenklasse durch ein einzelnes Zeichen zu ersetzen.

Beispiel:

tr -s "[:space:]" "\n" < text.txt

Dieser Befehl wandelt alle Leerzeichen und Tabulatoren im Text in der Datei text.txt in Zeilenumbrüche um.

Zeichen löschen und entfernen

Mit dem tr-Befehl kannst du nicht nur Zeichen ersetzen, sondern auch ganz entfernen.

Leere Zeichenfolge als Ersatz

Wenn du ein Leerzeichen oder eine leere Zeichenfolge als Ersatzzeichen angibst, wird das übereinstimmende Zeichen entfernt.

echo "Hallo Welt!" | tr 'a' ''
# Hllo Welt!

Zeichengruppen entfernen

Du kannst Bereichswerte oder Zeichengruppen verwenden, um mehrere Zeichen gleichzeitig zu entfernen.

echo "123abc456def" | tr -d '1-4'
# abc456def

Tipp: Die Option -d (oder --delete) ist ein Synonym für das Leerzeichen als Ersatzzeichen.

Mehrere Zeichen entfernen

Du kannst mit dem tr-Befehl auch mehrere übereinstimmende Zeichen entfernen.

echo "ababab" | tr -s 'a'
# ab

Die Option -s (oder --squeeze-repeats) unterdrückt wiederholte Zeichen im Ersetzungsteil.

Umgang mit Mehrfachzeileneingaben

Wenn du mit Textdateien arbeitest, die mehrere Zeilen umfassen, kann die Bearbeitung mit dem Befehl tr eine Herausforderung darstellen. Glücklicherweise bietet tr Optionen, die dir dabei helfen, diese Aufgabe zu bewältigen.

Zeilenweise Transformationen

Wenn du eine Transformation Zeile für Zeile anwenden möchtest, kannst du die Option -l (kleines L) verwenden. Diese Option weist tr an, jede Zeile der Eingabe separat zu bearbeiten, sodass du beispielsweise eine bestimmte Zeichenfolge in jeder Zeile suchen und ersetzen kannst.

tr -l 'a' 'b' < input.txt > output.txt

Im obigen Befehl wird jeder Buchstabe "a" in der Datei "input.txt" durch "b" ersetzt, und das Ergebnis wird in "output.txt" gespeichert.

Bearbeitung von Blöcken

Um eine Transformation auf einen bestimmten Block von Zeilen anzuwenden, kannst du die Option -d (kleines D) verwenden. Diese Option ermöglicht es dir, einen Bereich von Zeilen anzugeben, auf den die Transformation angewendet werden soll.

tr -d 2-4 'a' 'b' < input.txt > output.txt

Dieser Befehl ersetzt alle "a" durch "b" in den Zeilen 2 bis 4 der Datei "input.txt".

Verarbeitung langer Zeilen

Wenn du mit Zeilen arbeitest, die länger als die Standardpuffergröße sind, kann es zu Pufferüberläufen kommen. Um dieses Problem zu vermeiden, kannst du die Option -bu verwenden. Diese Option bewirkt, dass tr die Puffergröße für die Eingabe erhöht, sodass auch sehr lange Zeilen verarbeitet werden können.

tr -bu 'a' 'b' < long_lines.txt > output.txt

Mit diesem Befehl kannst du lange Zeilen sicher transformieren, ohne dir Gedanken über Pufferüberläufe machen zu müssen.

Behandlung von stdin und stdout

Der tr-Befehl kann sowohl aus einer Eingabedatei als auch von der Standard-Eingabe (stdin) lesen und sein Ergebnis entweder an eine Ausgabedatei oder an die Standard-Ausgabe (stdout) schreiben.

Verwendung von stdin

Wenn du keine Eingabedatei angibst, liest tr die Eingabe von stdin. Dies ist nützlich, wenn du die Ausgabe von einem anderen Befehl an tr weiterleiten möchtest. Beispielsweise kannst du die Ausgabe des cat-Befehls so transformieren:

cat text.txt | tr 'a-z' 'A-Z'

In diesem Beispiel wird der Inhalt der Datei text.txt in Großbuchstaben umgewandelt.

Verwendung von stdout

Standardmäßig schreibt tr seine Ausgabe an stdout. Du kannst jedoch auch eine Ausgabedatei angeben, indem du das >-Zeichen verwendest. Beispielsweise kannst du die Ausgabe wie folgt in eine Datei namens transformed.txt umleiten:

tr 'a-z' 'A-Z' < text.txt > transformed.txt

Beispiel für Mehrfachzeilen

Wenn du mehrzeilige Eingaben verarbeitest, solltest du die Option -s verwenden, die aufeinanderfolgende Leerzeichen entfernt. Dadurch wird sichergestellt, dass jeder Teil der Eingabe korrekt transformiert wird. Beispielsweise kannst du die folgende mehrzeilige Eingabe transformieren:

this
is
a
test

In das Folgende:

THIS
IS
A
TEST

durch Verwendung des folgenden Befehls:

tr -s 'a-z' 'A-Z'

Fehlerbehandlung und Exit-Codes

Prüfung auf Fehler

Der tr-Befehl gibt einen Exit-Code zurück, der den Erfolg oder Misserfolg des Befehls anzeigt. Du kannst diesen Exit-Code verwenden, um Fehler in deinen Skripten zu behandeln.

  • Exit-Code 0: Der Befehl wurde erfolgreich ausgeführt.
  • Exit-Code 1: Syntaxfehler oder ungültige Optionen.
  • Exit-Code 2: Fehler beim Öffnen einer Eingabedatei.
  • Exit-Code 3: Fehler beim Schreiben in eine Ausgabedatei.
  • Exit-Code 4: Ungültige Zeichensubstitution.
  • Exit-Code 5: Interne Fehler.

Du kannst den $?-Parameter verwenden, um den Exit-Code des zuletzt ausgeführten Befehls zu erhalten. Beispiel:

if [ $? -ne 0 ]; then
    echo "Fehler: Der tr-Befehl wurde nicht erfolgreich ausgeführt."
fi

Behandlung häufiger Fehler

Hier sind einige häufige Fehler bei der Verwendung des tr-Befehls und Tipps zur Behandlung:

Syntaxfehler

  • Überprüfe, ob du den Befehl richtig eingegeben hast und die Syntax korrekt ist.
  • Überprüfe die Verwendung von Anführungszeichen und Escape-Zeichen.

Ungültige Optionen

  • Stelle sicher, dass du gültige Optionen verwendest und diese korrekt formatiert sind.
  • Überprüfe die Dokumentation für eine Liste der gültigen Optionen.

Fehler beim Öffnen/Schreiben von Dateien

  • Überprüfe, ob die angegebene Eingabedatei existiert und lesbar ist.
  • Überprüfe, ob die angegebene Ausgabedatei beschreibbar ist.
  • Verwende die -f-Option, um vorhandene Ausgabedateien zu überschreiben.

Ungültige Zeichensubstitution

  • Stelle sicher, dass die Zeichensubstitution gültig ist und in der angegebenen Reihenfolge erfolgt.
  • Überprüfe, ob du Escape-Zeichen für Sonderzeichen verwendest.

Beispiele für häufige Transformationen

In diesem Abschnitt findest du Beispiele für einige häufig verwendete Transformationen mit dem tr-Befehl, die dir helfen können, häufige Textaufgaben zu erledigen.

Groß- und Kleinschreibung ändern

Um alle Kleinbuchstaben in einem Text in Großbuchstaben umzuwandeln, kannst du Folgendes verwenden:

echo "kleiner text" | tr [:lower:] [:upper:]

Umgekehrt kannst du alle Großbuchstaben in Kleinbuchstaben umwandeln:

echo "GROSSER TEXT" | tr [:upper:] [:lower:]

Bestimmte Zeichen ersetzen

Du kannst bestimmte Zeichen durch andere ersetzen, indem du die Zeichenoption verwendest. Beispielsweise ersetzt der folgende Befehl alle Leerzeichen ( ) durch Unterstriche (_):

echo "Text mit Leerzeichen" | tr " " "_"

Zeichen entfernen

Um bestimmte Zeichen aus einem Text zu entfernen, kannst du die Option -d verwenden. Der folgende Befehl entfernt beispielsweise alle Kommas , aus dem Text:

echo "Text,mit,Kommas" | tr -d ","

Mehrfachzeilige Eingaben verarbeiten

Wenn du mit mehrzeiligen Eingaben arbeitest, kannst du die Option -s verwenden, um Zeilenumbrüche zu unterdrücken. Der folgende Befehl ersetzt beispielsweise alle Leerzeichen in einer mehrzeiligen Eingabe durch Unterstriche:

echo "Text mit
Leerzeichen" | tr -s " " "_"

Umwandlung von Groß- und Kleinbuchstaben in einem Bereich

Um Groß- und Kleinbuchstaben in einem bestimmten Bereich zu transformieren, kannst du die Bereichsoption verwenden. Der folgende Befehl wandelt beispielsweise alle Großbuchstaben zwischen A und E in Kleinbuchstaben um:

echo "ABCDEF" | tr '[:upper:A-E]' '[:lower:a-e]'

Komplexe Transformationen

Du kannst auch komplexere Transformationen durchführen, indem du mehrere Optionen kombinierst. Beispielsweise wandelt der folgende Befehl alle Kleinbuchstaben einer E-Mail-Adresse in Großbuchstaben und ersetzt das @-Symbol durch einen Unterstrich:

echo "[email protected]" | tr '[:lower:]@[[:upper:]]' '_@'