Wie funktioniert tr '[az]' '[n-za-m]'?

10

Ich habe eine verschleierte E-Mail-Adresse gefunden, die mit diesem Befehl entschlüsselt werden kann:

echo "[email protected]" | tr '[a-z]' '[n-za-m]'

Wie gibt das eine gültige E-Mail-Adresse aus? Was macht dieser Befehl?

LanceBaynes
quelle
Gewöhnen Sie sich an, das Gebietsschema zu erzwingen: Ändern: tr '[a-z]' '[n-za-m]'in:LC_ALL='C' tr '[a-z]' '[n-za-m]'
Olivier Dulac

Antworten:

18

trDie Manpage erklärt es ziemlich gut. Es ist ein Filter, der Zeichen von einem Satz in einen anderen konvertiert. Der erste angegebene Satz [a-z]ist eine Kurzform der Eingabe [abcdefghijklmnopqrstuvwxyz]. Das zweite ist [n-za-m], was sich in verwandelt [nopqrstuvwxyzabcdefghijklm]. trjedes Zeichen von stdin liest, und wenn es im ersten Satz erscheint, ersetzt es mit dem Charakter in der gleichen Position in dem zweiten Satz (dies bedeutet [und ]mit sich selbst immer ersetzt, so einschließlich ihnen war sinnlos, aber eine Menge Leute , Tun Sie es versehentlich, weil reguläre Ausdrücke sie verwenden, um Zeichenklassen darzustellen, damit sie denken, trdass sie dies erfordern.

Also ein einfacheres Beispiel:

$ echo abc | tr ab xy
xyc

averwandelte sich in x, bverwandelte sich in yund cwurde unverändert gelassen, weil es nicht im ersten Satz war. In diesem Fall muss der Benutzer lediglich seine E-Mail-Adresse über denselben Filter ausführen (da dieser symmetrisch ist - aZuordnungen zu nund nzurück ausw.), um die gedrehte Version zu erhalten. Wenn Sie es erneut durchlaufen, werden alle Zeichen auf ihre Originale zurückgesetzt


Nebenbemerkung: Dieser spezielle Tausch, bei dem jeder Buchstabe durch die 13 Zeichen im Alphabet ersetzt wird, heißt ROT13 (13 drehen). Es war in Newsgroups beliebt, um Dinge zu verbergen, die die Leute vielleicht nicht sehen wollen

Michael Mrozek
quelle
1
Einschließlich [und ]ist nützlich: Sie sind manchmal obligatorisch (einige Solaris-Standardgeräte benötigen sie beispielsweise). Daher ist es wahrscheinlich eine gute Angewohnheit (sobald man weiß, dass man diese nicht mit einem regulären Ausdruck "[...]" mischt)
Olivier Dulac
7

tr transliteriert Zeichen: Für einige Zeichen x in der Eingabe wird ein Zeichen y ausgegeben.

tr Es werden zwei Befehlszeilenargumente verwendet, die Zeichen "von" und "bis".

In Ihrem obigen Beispiel werden die "von Zeichen" als angegeben '[a-z]'. Die "zu Zeichen" werden als angegeben '[n-za-m]'. Die einfachen Anführungszeichen verhindern, dass die Shell, die die Befehlszeile interpretiert, die beiden Argumente ändert. trbehandelt Argumente in eckigen Klammern als Bereiche. So '[a-z]' means "all lower case characters from 'a' to 'z', inclusive". The second argument is a bit more complicated,'[n-za-m]' `bedeutet„Kleinbuchstaben von 'n' bis 'z' einschließlich und Kleinbuchstaben von 'a' bis 'm', inklusive‘.

trtransliteriert alle eingegebenen 'a' Zeichen in 'n', 'b' in 'm', 'c' in 'o' usw. bis zu 'n' Zeichen, die als 'z' ausgegeben werden. 'o' Zeichen in der Eingabe werden als 'a', 'p' bis 'b', 'q' bis 'c' usw. ausgegeben. 'z' Zeichen in der Eingabe werden als 'l' ausgegeben.

Im Wesentlichen führt Ihr Befehl bei seiner Eingabe eine Caesar-Chiffre durch , jeweils ein Kleinbuchstabe. Jemand musste "[email protected]" verschlüsseln, um die von Ihnen echoausgegebene Zeichenfolge zu erhalten.

Bruce Ediger
quelle
1
mehrere Vorbehalte :: So '[a-z]' means "all lower case characters from 'a' to 'z', inclusive"nein, es bedeutet: '[' und alle Buchstaben 'a' bis 'z' (in Ihrem Gebietsschema!) und ']'. Zum Glück ersetzt das 2. Argument "[" durch "[" und "]" durch "]". Die andere Einschränkung: In einigen Gebietsschemas kann az sein: alle ASCII-Kleinbuchstaben oder alle Buchstaben (Klein- und Großbuchstaben) außer "A" (oder außer "Z" in anderen Gebietsschemas) oder manchmal sogar "alle Buchstaben a bis z" einschließlich Buchstaben mit Akzent ". Um das Übliche zu gewährleisten: Erzwingen Sie das Gebietsschema, während Sie tr: LC_ALL='C' tr 'a-z' 'A-Z'(oder LC_ALL='C' tr '[a-z]' '[A-Z]') aufrufen
Olivier Dulac