Chcę użyć tr
do transformacji rot13. Mogę pięknie zrozumieć to polecenie:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
które wyjście HELP ME PLEASE
, ale nie mogę zrozumieć, w jaki sposób to drugie polecenie może wygenerować taką samą transformację rot13:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
Mam więc dwa pytania:
- Jaka jest magia drugiego
tr
polecenia? - Jak sprawić, by drugie polecenie działało zarówno dla małych, jak i wielkich liter, tak jak pierwsze polecenie?
tr [.*13].A-Z A-ZA-Z
działa równie dobrzetr .............A-Z A-ZA-Z
Odpowiedzi:
Działa w następujący sposób:
Tak
tr
przełożySET1
sięSET2
.Jest to równoważne z pierwszym, ponieważ przesuwa się również o
13
jednostki, ponieważ jest tam 13 kropek.Aby dołączyć małe litery, musisz ustawić je
SET1
z podobnym przesunięciem, tj .:To 26 kropek pomiędzy
Z
ia
, obejmujących połowę wielkich i połowę małych liter. Więctr
samo polecenie będzie:źródło
Jak mówi @Prvt_Yadv w swojej odpowiedzi, działa, ponieważ jest 13 kropek.
Zestawy są
Kropka nie jest znakiem specjalnym, więc jeśli masz kropkę na wejściu, również zostanie przetłumaczona. W wersji
tr
, którą mam, jest to ostatni odpowiedni znak w drugim zestawie, w tym przypadkuM
:(Mogłem sobie wyobrazić, że inna wersja
tr
może użyć pierwszego pasującego znaku w zestawie 2, co dałoby znakA
.)Aby odpowiedzieć na drugie pytanie , potrzebujesz kolejnych 13 kropek w pierwszym zestawie, aby „zużyć” pozostałe wielkie litery w zestawie 2:
następnie możesz powtórzyć wzór:
co daje nam:
A więc:
Osobiście uważam, że pierwszy sposób zrobienia tego w twoim pytaniu jest prostszy!
Pierwszy sposób również nie przekształca żadnych innych znaków na wejściu. Na przykład porównaj:
z
źródło
Ok, więc dzięki @Prvt_Yadv mogłem zrozumieć kropki. Oto pierwsza odpowiedź na pytanie:
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: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ę:
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ę
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:Odrzucając początkową sekwencję i końcowe powtarzające się litery, stają się:
Który jest podstawieniem rot3.
Teraz drugie pytanie:
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:
To z powodzeniem stworzy niewrażliwy rot8. Aby zobrazować, dlaczego to działa, zobaczmy zestawy:
Z wyjątkiem mapowania kropek i końcowych liter:
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: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 wtr
poleceniu stanowi problem, możesz@
na przykład użyć zamiast tego. To działałoby tak samo dobrze:źródło
tr
jest mapowany z zestawu 1 na zestaw 2, ale w tym przypadku odwzorowałeś postać.
naA
, a takżeB
, a także ..., a takżeM
. To nie ma znaczenia, ponieważ twoje dane wejściowe nie zawierają.
, ale gdyby tak się stało, zmieniłoby się wM
(tr
używa ostatniego wyjścia określonego dla danego wejścia)