So verwenden Sie den Linux-Befehl tr
Veröffentlicht: 2023-05-17Benö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.
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'
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'
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'
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 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]'
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]'
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:]'
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' '-'
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' '-'
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'
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:]'
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:]'
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:]'
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:]'
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 ''
Genauso gut können wir Ziffern löschen.
echo abcd123efg | tr -d '[:digit:]'
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:]'
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'
Wir können auch das Trennzeichen ändern, das Wörter trennt. Dieser Befehl ersetzt Leerzeichen durch Doppelpunkte „ :
“.
echo 'eins zwei drei vier' | 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"
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' ' '
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:]'
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.
Wenn Sie jedoch Schwierigkeiten haben, etwas mit tr
zu tun, und lange Befehlsketten aufbauen, sollten Sie wahrscheinlich sed
verwenden.