Ok, więc dzięki @Prvt_Yadv mogłem zrozumieć kropki. Oto pierwsza odpowiedź na pytanie:
Jaka jest magia drugiego tr
polecenia?
13 kropek jest po prostu mapowanych na pierwsze 13 liter z drugiego zestawu. Więc
tr .............A-Z A-ZA-Z
wyprodukuje następujące zestawy:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Jeśli dane wejściowe nie zawierają kropki, możesz odrzucić początkową sekwencję, ponieważ nie użyjesz tych podstawień. Wtedy zestawy stałyby się:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Ale ponieważ pierwszy zestaw zawiera już wszystkie 26 liter, a set2 ma powtarzającą się literę końcową, one również są odrzucane, w końcu stając się
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Który jest podstawieniem rot13 i jest identyczny z pierwszym poleceniem (oprócz tego, że nie ma tu do czynienia z małymi literami). Tę samą logikę można zastosować do tytułu pytania:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
wyprodukuje zestawy:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Odrzucając początkową sekwencję i końcowe powtarzające się litery, stają się:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Który jest podstawieniem rot3.
Teraz drugie pytanie:
Jak sprawić, by drugie polecenie działało zarówno dla małych, jak i wielkich liter, tak jak pierwsze polecenie?
Aby zadziałało, umieść na początku żądaną liczbę kropek, dopasowując swoją zgniliznę i 26 kropek między sekwencją górną i dolną, tak jak poniżej:
tr ........A-Z..........................a-z A-ZA-Za-za-z
To z powodzeniem stworzy niewrażliwy rot8. Aby zobrazować, dlaczego to działa, zobaczmy zestawy:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Z wyjątkiem mapowania kropek i końcowych liter:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Teraz działa na duże i małe litery :)
Innym sposobem, aby działało, jest użycie dwóch tr
poleceń w następujący sposób:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
Zastrzeżenie dotyczące używania podstawiania kropek zostało przekazane przez @iruvar: to polecenie nie będzie działać zgodnie z oczekiwaniami, gdy łańcuch wejściowy zawiera kropki. Wynika to z tego, że kropki są odwzorowywane na inne litery, a podczas podstawiania tr
zmieni kropkę wejściową na ostatnią odwzorowaną literę. Ale możesz użyć dowolnego innego znaku niż kropki. Jeśli więc używanie kropek w tr
poleceniu stanowi problem, możesz @
na przykład użyć zamiast tego. To działałoby tak samo dobrze:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."