Tr Kommando

Aus Si:Wiki von Siegrist SystemLösungen - Informatik und Rezepte
Version vom 17. Mai 2021, 17:35 Uhr von Sigi (Diskussion | Beiträge) (Caesar-Verschlüsselung / monoalphabetische Substitution)

Wechseln zu: Navigation, Suche
Mit tr können Zeichen ersetzt, komprimiert oder gelöscht werden.


Synopsis:
 tr [option]... SET1 [SET2]


tr akzeptiert zwei Zeichensätze SET1 und SET2, in der Regel mit der gleichen Länge, und ersetzt die Zeichen des ersten Satzes durch die entsprechenden Zeichen des zweiten Satzes.
SET2 wird an die Länge von SET1 angepasst entweder durch Kürzung, oder durch Erweiterung indem das letzte Zeichen aus SET2 bis zur Länge von SET1 wiederholt wird. Die -t Option invertiert dieses Verhalten.
Ein SET ist im Grunde eine Zeichenkette, einschließlich Sonderzeichen als interpretierte Folgen mit Backslash.


Zeichen ersetzen

$ echo "123abcABC" | tr "abc" "xyz"

oder

$ echo "123abcABC" | tr "a-c" "x-z"
ergibt 123xyzABC

Gross/Klein umwandeln:

$ echo "123abcABC" | tr "a-z" "A-Z"
ergibt 123ABCABC


Mit -c (--complement) Option werden alle Zeichen ausser jenen in SET1 ersetzt:

$ echo "123abcABC" | tr -c "abc" "0"
ergibt 000abc0000

Das überzälige 0 am Schluss ist das unsichtbare \n des echo Kommandos. Es gibt 2 Möglichkeiten das zu verhindern:

$ echo -n "123abcABC" | tr -c "abc" "0"
oder
$ echo "123abcABC" | tr -c "abc\n" "0"
ergibt 000abc000


Zeichen komprimieren -s (--squeeze-repeats)

-s ersetzt eine Folge von wiederholtem Auftreten eines Zeichens durch ein (anderes) Zeichen.

Nur mit SET1 wird das Zeichen in SET1 komprimiert:

$ echo "SI     Wiki" | tr -s " "
ergibt SI Wiki


mit SET1 und SET2 werden die Zeichen aus SET1 komprimiert und mit SET2 ersetzt:

$ echo "SI     Wiki" | tr -s " " ":"
ergibt SI:Wiki


Zeichen löschen -d (--delete)

Alle Vorkommen der Zeichen aus SET1 werden gelöscht.

$ echo "SI     Wiki" | tr -d " i"
ergibt SIWk


Einige Beispiele

Zufallszahl erzeugen

$ tr -cd 0-9 </dev/urandom | head -c 7

Liest aus /dev/urandom, bildet durch Komplement alle Nicht-Zahlen (-c 0-9), löscht alle diese Nicht-Zahlen (-d), und gibt die ersten 7 Zeichen (head -c 7) davon aus.

Jedes Wort im Satz auf eine neue Zeile

$ echo "Jedes Wort im Satz auf eine neue Zeile" | tr -cs [:alnum:] "\n"

Sammelt das Komplement (-c) aller alphanumerischen Zeichen und ersetzt und komprimiert diese Menge nicht-alphanumerischer Zeichen durch ein Newline.


Alle leeren Zeilen einer Datei löschen

$ tr -s "\n" < eingabedatei.txt > ausgabedatei.txt

Liest die eingabedatei.txt (<), wandelt alle mehrfach hintereinander vorkommenden Newlines in ein einzelnes Newline (-s) und schreibt das Ergebnis in die ausgabedatei.txt (>).


Caesar-Verschlüsselung / monoalphabetische Substitution

Caeser Verschlüsselung mit Schlüssel "d", also einer Verschiebung um 4 Buchstaben unter Beibehalt von Gross- Kleinsbuchstaben, darum die jeweilige Verdopplung in den beiden SETs, 'a-z' resp. 'e-zabcd' durch die Grossbuchstaben.

Jedes Zeichen in a-z resp. A-Z wird um 4 Stellen verschoben zu e-zabcd resp. E-ZABCD.


$ echo "Das ist eine geheime Nachricht" | tr 'a-zA-Z' 'e-zabcdE-ZABCD'
ergibt Geheimtext "Hew mwx imri kilimqi Reglvmglx"


zum Entschlüsseln des Geheimtextes wird einfach SET1 und SET2 vertauscht:

$ echo "Hew mwx imri kilimqi Reglvmglx" | tr 'e-zabcdE-ZABCD' 'a-zA-Z'
ergibt Klartext "Das ist eine geheime Nachricht"