So verwenden Sie den Linux-Befehl tr

Veröffentlicht: 2023-05-17
Ubuntu Linux-Startbildschirm auf einem Laptop
Jordan Gloor / How-To Geek
Der Befehl tr führt Transformationen an einem Textstrom durch und erzeugt einen neuen Stream als Ausgabe. Sie können Zeichen entsprechend den Regeln, die Sie in der Befehlszeile festlegen, ersetzen, löschen oder konvertieren.

Benötigen Sie eine unkomplizierte Methode zum Bearbeiten eines Textstroms unter Linux? Suchen Sie nicht weiter als bis zum Befehl tr, der Ihnen beim Ersetzen, Entfernen, Kombinieren und Komprimieren von Eingabetext Zeit sparen kann. So wird es gemacht.

Inhaltsverzeichnis

Was ist der tr-Befehl?
Zeichen ersetzen
Verwendung von Bereichen und Token
Umkehren der Übereinstimmungen
Zeichen löschen und komprimieren
Charaktere löschen
Linien kombinieren und teilen
Verwenden von tr mit Pipes
Einfach ist so einfach wie es ist

Was ist der tr-Befehl?

Der Linux-Befehl tr ist ein schnelles und einfaches Dienstprogramm zum Entfernen unerwünschter Zeichen aus Textströmen und für andere nette Manipulationstricks. Der Name leitet sich vom Wort „translate“ ab und die Wurzeln von tr liegen tief in der Unix-Tradition.

Wie wir alle wissen, ist Linux eine Open-Source-Neufassung von Unix. Es fügt der Mischung auch seine eigenen Sachen hinzu. Es handelt sich nicht um einen Byte-für-Byte-Klon, aber es übernimmt eindeutig einen Großteil seiner Designprinzipien und technischen Anleitungen vom Unix-Betriebssystem.

Obwohl bisher nur zwei Linux-Distributionen als POSIX-kompatibel zertifiziert und offiziell als Unix-Implementierungen akzeptiert wurden – EulerOS und Inspur K-UX – hat Linux Unix in der Geschäftswelt fast vollständig verdrängt.

Alle Linux-Distributionen folgen, zumindest in ihren Kerndienstprogrammen, der Unix-Philosophie. Die Unix-Philosophie fasst die Vision zusammen, die die Unix-Pioniere für ihr neues Betriebssystem hatten. Es wird oft umformuliert als: „Schreiben Sie Programme, die eine Sache gut machen.“ Aber es steckt noch mehr dahinter.

Eine der wirkungsvollsten Neuerungen bestand darin, dass Programme eine Ausgabe generieren sollten, die als Eingabe für andere Programme verwendet werden konnte. Die Möglichkeit, Befehlszeilen-Dienstprogramme miteinander zu verketten und dabei den Ausgabestream eines Programms als Eingabestream für das nächste Programm in der Reihe zu verwenden, ist enorm leistungsstark.

Manchmal möchten Sie die Ausgabe eines Programms optimieren oder optimieren, bevor sie das nächste Programm in der Reihe erreicht. Oder vielleicht übernehmen Sie Ihre Eingaben nicht von einem Linux-Befehlszeilentool, sondern streamen Text aus einer Datei, die nicht speziell für Ihre Anforderungen erstellt wurde.

Hier kommt tr ins Spiel. Es ermöglicht Ihnen, eine Reihe einfacher Transformationen an seinem Eingabestream durchzuführen, um seinen Ausgabestream zu erzeugen. Dieser Ausgabestream kann in eine Datei umgeleitet, in ein anderes Linux-Programm oder sogar in eine andere Instanz von tr eingespeist werden, um mehrere Transformationen auf den Stream anzuwenden.

Zeichen ersetzen

Der Befehl tr verarbeitet seinen Eingabestream gemäß Regeln. Bei Verwendung ohne Befehlszeilenoptionen besteht die Standardaktion von tr darin, Zeichen im Eingabestream durch andere Zeichen zu ersetzen.

Befehle für tr erfordern normalerweise zwei Zeichensätze. Der erste Satz enthält die Zeichen, die ersetzt werden, wenn sie im Eingabestream gefunden werden. Der zweite Satz enthält die Zeichen, durch die sie ersetzt werden.

Dies funktioniert so, dass das Vorkommen des ersten Zeichens in Satz eins durch das erste Zeichen in Satz zwei ersetzt wird. Vorkommen des zweiten Zeichens in Satz eins werden durch das zweite Zeichen in Satz zwei ersetzt und so weiter.

In diesem Beispiel wird im Eingabestream für tr nach dem Buchstaben „c“ gesucht und jedes Vorkommen durch den Buchstaben „z“ ersetzt. Beachten Sie, dass tr die Groß-/Kleinschreibung beachtet wird.

Wir verwenden echo um Text in tr zu übertragen.

 echo abcdefabc | tr 'c' 'z' 

Ersetzen eines einzelnen Zeichens durch tr

Alle Vorkommen von „c“ werden durch „z“ ersetzt und die neue Zeichenfolge wird in das Terminalfenster geschrieben.

Dieses Mal suchen wir nach zwei Buchstaben, „a“ und „c“. Beachten Sie, dass wir nicht nach „ac“ suchen. Wir suchen nach „a“ und dann nach „c“. Wir werden jedes Vorkommen von „a“ durch „x“ und jedes Vorkommen von „c“ durch „z“ ersetzen.

 echo abcdefabc | tr 'ac' 'xz' 

Zwei Buchstaben mit tr entfernen

Damit dies funktioniert, müssen in beiden Sätzen die gleiche Anzahl an Zeichen vorhanden sein. Wenn Sie dies nicht tun, kommt es zu vorhersehbarem, aber wahrscheinlich unerwünschtem Verhalten.

 echo „Nenn mich Ismael.“ | tr 'abcdjklm' '123' 

Verwendung unausgeglichener Zeichensätze mit tr

In Set eins gibt es mehr Charaktere als in Set zwei. Die Buchstaben „d“ bis „m“ haben im zweiten Satz kein entsprechendes Zeichen. Sie werden immer noch ersetzt, aber sie werden alle durch den letzten Charakter im zweiten Satz ersetzt.

Es ist durchaus möglich, dass dies in manchen Fällen nützlich sein könnte, aber wenn Sie dies verhindern möchten, können Sie die Option -t (truncate) verwenden. Dadurch werden nur diejenigen Zeichen ersetzt, die in Satz eins enthalten sind und zu denen es in Satz zwei ein entsprechendes Zeichen gibt.

 echo „Nenn mich Ismael.“ | tr -t 'abcdjklm' '123' 

Verwendung unausgeglichener Zeichensätze mit tr mit der Option truncate

Verwendung von Bereichen und Token

Satz eins und Satz zwei können Zeichenbereiche enthalten. Beispielsweise steht [az] für alle Kleinbuchstaben und [AZ] für alle Großbuchstaben. Wir können dies nutzen, um die Groß-/Kleinschreibung eines Textstroms zu ändern.

Dadurch wird der Eingabestream in Großbuchstaben umgewandelt.

 echo „How-To Geek“ | tr '[az]' '[AZ]' 

Verwenden von Zeichenbereichen zum Konvertieren einer Zeichenfolge in Großbuchstaben

Um die Groß-/Kleinschreibung in die andere Richtung umzukehren, können wir denselben Befehl verwenden, jedoch mit vertauschten Groß- und Kleinbuchstabenbereichen in der Befehlszeile.

 echo „How-To Geek“ | tr '[AZ]' '[az]' 

Verwenden von Zeichenbereichen zum Konvertieren einer Zeichenfolge in Kleinbuchstaben

Es gibt Token, die wir für einige der häufigsten Fälle verwenden können, mit denen wir möglicherweise einen Abgleich durchführen möchten.

  • [:alnum:] : Buchstaben und Ziffern.
  • [:alpha:] : Nur Buchstaben.
  • [:digit:] : Nur Ziffern.
  • [:blank:] : Tabulatoren und Leerzeichen.
  • [:space:] : Alle Leerzeichen, einschließlich Zeilenumbrüche.
  • [:graph:] : Alle Zeichen einschließlich Symbole, jedoch keine Leerzeichen.
  • [:print:] : Alle Zeichen einschließlich Symbole, einschließlich Leerzeichen.
  • [:punct:] : Alle Satzzeichen.
  • [:lower:] : Kleinbuchstaben.
  • [:upper:] : Großbuchstaben.

Mithilfe von Token können wir die Konvertierung von Klein- in Großbuchstaben und von Groß- in Kleinbuchstaben genauso einfach durchführen.

 echo „How-To Geek“ | tr '[:lower:]' '[:upper:]'
 echo „How-To Geek“ | tr '[:upper:]' '[:lower:]' 

Verwenden von Token, um die Groß-/Kleinschreibung von Textzeichenfolgen zu ändern

Umkehren der Übereinstimmungen

Die Option -c (Komplement) gleicht alle Zeichen außer denen im ersten Satz ab. Dieser Befehl wandelt alles außer dem Buchstaben „c“ in einen Bindestrich „ - “ um.

 echo abcdefc | tr -c 'c' '-' 

Ersetzen aller bis auf die angegebenen Zeichen durch andere Zeichen

Dieser Befehl fügt dem ersten Satz den Buchstaben „a“ hinzu. Alles außer „a“ oder „c“ wird in einen Bindestrich „ - “ umgewandelt.

 echo abcdefc | tr -c 'ac' '-' 

Ersetzen aller bis auf die angegebenen mehreren Zeichen durch andere Zeichen

Zeichen löschen und komprimieren

Wir können tr verwenden, um Zeichen ganz und ohne Ersatz zu entfernen.

Dieser Befehl verwendet die Option -d (Löschen), um jedes Vorkommen von „a“, „d“ oder „f“ aus dem Eingabestream zu entfernen.

 echo abcdefc | tr -d 'adf' 

Mehrere Zeichen aus einer Textzeichenfolge mit tr löschen

Dies ist ein Fall, in dem wir nur einen Zeichensatz in der Befehlszeile haben, nicht zwei.

Eine andere Möglichkeit besteht darin, die -s (squeeze-repeats) zu verwenden. Diese Option reduziert wiederholte Zeichen auf ein einzelnes Zeichen.

In diesem Beispiel werden wiederholte Sequenzen des Leerzeichens auf ein einziges Leerzeichen reduziert.

 echo „abc de fc“ | tr -s '[:blank:]' 

Wiederholte Zeichenfolgen in ein einzelnes Vorkommen des Zeichens umwandeln, mit tr

Es ist etwas verwirrend, dass das Token [:blank:] das Leerzeichen darstellt und das Token [:space:] alle Formen von Leerzeichen darstellt, einschließlich Tabulatoren und Zeilenumbrüche.

In diesem Fall könnten wir [:blank:] durch [:space:] ersetzen und das gleiche Ergebnis erhalten.

 echo „abc de fc“ | tr -s '[:space:]' 

Wiederholte Zeichenfolgen in ein einzelnes Vorkommen des Zeichens umwandeln, mit tr

Charaktere löschen

Die Unterschiede zwischen [:blank:] und [:space:] werden deutlich, wenn wir Zeichen löschen. Dazu verwenden wir die Option -d (Löschen) und stellen eine Reihe von Zeichen bereit, nach denen tr in seinem Eingabestream sucht. Alle gefundenen Dateien werden entfernt.

 echo „abc de fc“ | tr -d '[:blank:]' 

Leerzeichen (Leerzeichen) aus einer Textzeichenfolge löschen, mit tr

Die Leerzeichen werden gelöscht. Beachten Sie, dass wir eine neue Zeile erhalten, nachdem der Ausgabestream in das Terminalfenster geschrieben wurde. Wenn wir diesen Befehl wiederholen und [:space:] anstelle von Leerzeichen verwenden, erhalten wir ein anderes Ergebnis.

 echo „abc de fc“ | tr -d '[:blank:]' 

Leerzeichen aus einer Textzeichenfolge löschen, mit tr

Dieses Mal beginnen wir nach der Ausgabe keine neue Zeile, sondern die Eingabeaufforderung grenzt direkt daran an. Dies liegt daran, dass [:space:] Zeilenumbrüche enthält. Alle Leerzeichen, Tabulatoren und Zeilenumbrüche werden aus dem Eingabestream entfernt.

Natürlich können Sie auch ein tatsächliches Leerzeichen verwenden.

 echo „abc de fc“ | tr -d '' 

Löschen von Leerzeichen aus einer Textzeichenfolge durch Angabe eines Leerzeichens mit tr

Genauso gut können wir Ziffern löschen.

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

Mit tr Ziffern aus einer Textfolge löschen

Durch die Kombination der Optionen -c (Komplement) und -d (Löschen) können wir alles außer Ziffern löschen.

 echo abcd123efg | tr -cd '[:digit:]' 

Mit tr alles außer Ziffern aus einer Textzeichenfolge löschen

Beachten Sie, dass alles außer Ziffern alle Buchstaben und alle Leerzeichen bedeutet, sodass wir erneut den abschließenden Zeilenumbruch verlieren.

Linien kombinieren und teilen

Wenn wir Leerzeichen durch Zeilenumbruchzeichen ersetzen, können wir eine Textzeile teilen und jedes Wort in einer eigenen Zeile platzieren.

 echo 'eins zwei drei vier' | tr ' ' '\n' 

Aufteilen einer Textzeile in ein Wort pro Zeile, mit tr

Wir können auch das Trennzeichen ändern, das Wörter trennt. Dieser Befehl ersetzt Leerzeichen durch Doppelpunkte „ : “.

 echo 'eins zwei drei vier' | tr ' ' ':' 

Ändern des Worttrennzeichens von Leerzeichen in Doppelpunkte mit tr

Wir können jedes verwendete Trennzeichen finden und es durch Zeilenumbrüche ersetzen, um schwer lesbaren Text in eine einfacher zu verwaltende Ausgabe aufzuteilen.

Die Umgebungsvariable path ist eine lange Zeichenfolge mit vielen Verzeichnispfaden. Ein Doppelpunkt „ : “ trennt jeden Pfad. Wir werden sie in Newline-Zeichen umwandeln.

 echo $PATH
 echo $PATH | tr ":" "\n" 

Aufteilen der Umgebungsvariablen $PATH in separate Verzeichnispfade, einen pro Zeile, mit tr

Das ist visuell viel einfacher zu analysieren.

Wenn wir eine Ausgabe haben, die wir in eine einzelne Zeile umformatieren möchten, können wir das auch tun. Die Datei „lines.txt“ enthält Text mit einem Wort in jeder Zeile. Wir werden das in tr einspeisen und in eine einzelne Zeile umwandeln.

 cat-Dateien.txt
 catlines.txt | tr '\n' ' ' 

Kombinieren mehrzeiliger Eingaben zu einer einzigen Textzeile mithilfe von tr

Verwenden von tr mit Pipes

Wir können die Ausgabe von tr als Eingabe für ein anderes Programm oder sogar für tr selbst verwenden.

Dieser Befehl verwendet tr viermal.

  • Das erste tr löscht alle Bindestriche „-“ aus der Eingabe.
  • Das zweite tr drückt alle wiederholten Leerzeichen in einzelne Leerzeichen zusammen.
  • Das dritte tr ersetzt Leerzeichen durch Unterstriche „_“.
  • Das vierte und letzte tr wandelt die Zeichenfolge in Kleinbuchstaben um.
 echo „Verstümmelte Dateiname.txt“ | tr -d '-' | tr -s '' | tr ' ' '_' | tr '[:upper:]' '[:lower:]' 

Eine Pipeline von vier Instanzen von tr

VERWANDT: So verwenden Sie Pipes unter Linux

Einfach ist so einfach wie es ist

Der Befehl tr ist großartig, weil er einfach ist. Es gibt nicht viel zu lernen oder sich daran zu erinnern. Aber seine Einfachheit kann auch sein Untergang sein.

Täuschen Sie sich nicht, Sie werden häufig feststellen, dass Sie tr das tun können, was Sie brauchen, ohne zu komplizierteren Tools wie sed greifen zu müssen.

So verwenden Sie den sed-Befehl unter Linux
VERWANDT: Verwendung des sed-Befehls unter Linux

Wenn Sie jedoch Schwierigkeiten haben, etwas mit tr zu tun, und lange Befehlsketten aufbauen, sollten Sie wahrscheinlich sed verwenden.