Do czego służą kropki w tym poleceniu tr: tr… AZ A-ZA-Z <<< „JVPQBOV” (z 13 kropkami)

18

Chcę użyć trdo 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:

  1. Jaka jest magia drugiego trpolecenia?
  2. Jak sprawić, by drugie polecenie działało zarówno dla małych, jak i wielkich liter, tak jak pierwsze polecenie?
Frederico Oliveira
źródło
Wiem, że jest 13 kropek. Chcę wiedzieć, jak to działa. W instrukcji nie ma wyjaśnienia na temat kropek
Frederico Oliveira
4
lepiej mieć nadzieję, że nie napotkasz kropki w tekście wejściowym
iruvar
1
FWIW krótsza forma tr [.*13].A-Z A-ZA-Zdziała równie dobrzetr .............A-Z A-ZA-Z
iruvar

Odpowiedzi:

17

Działa w następujący sposób:

SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM

Tak trprzełoży SET1się SET2.

Jest to równoważne z pierwszym, ponieważ przesuwa się również o 13jednostki, ponieważ jest tam 13 kropek.

Aby dołączyć małe litery, musisz ustawić je SET1z podobnym przesunięciem, tj .:

.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

To 26 kropek pomiędzy Zi a, obejmujących połowę wielkich i połowę małych liter. Więc trsamo polecenie będzie:

tr .............A-Z..........................a-z A-ZA-Za-za-z
Prvt_Yadav
źródło
14

Jak mówi @Prvt_Yadv w swojej odpowiedzi, działa, ponieważ jest 13 kropek.

Zestawy są

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

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 przypadku M:

$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM

(Mogłem sobie wyobrazić, że inna wersja trmoże użyć pierwszego pasującego znaku w zestawie 2, co dałoby znak A.)

Aby odpowiedzieć na drugie pytanie , potrzebujesz kolejnych 13 kropek w pierwszym zestawie, aby „zużyć” pozostałe wielkie litery w zestawie 2:

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ

następnie możesz powtórzyć wzór:

First set:  .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz

co daje nam:

tr .............A-Z..........................a-z A-ZA-Za-za-z

A więc:

$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please

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:

$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z  
Help me pleasem

z

$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
użytkownik7761803
źródło
1

Ok, więc dzięki @Prvt_Yadv mogłem zrozumieć kropki. Oto pierwsza odpowiedź na pytanie:

Jaka jest magia drugiego trpolecenia?

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 trpoleceń 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 trzmieni 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 trpoleceniu 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..."
Frederico Oliveira
źródło
3
Nie jestem pewien, w jaki sposób doszedłeś do wniosku, że „kropki są zastępowane ciągiem liter zaczynającym się od a do liczby kropek”; wcale tak nie jest. Nie ma w tym żadnej magii; jak wyjaśnił Prvt_Yadv, jak zwykle istnieją dwa zestawy i trjest mapowany z zestawu 1 na zestaw 2, ale w tym przypadku odwzorowałeś postać .na A, a także B, a także ..., a także M. To nie ma znaczenia, ponieważ twoje dane wejściowe nie zawierają ., ale gdyby tak się stało, zmieniłoby się w M( trużywa ostatniego wyjścia określonego dla danego wejścia)
Michał Mrożek
Dziękuję za wyjaśnienie. Zaktualizowałem odpowiedź, aby naprawić błędy :)
Frederico Oliveira
1
Podziwiam twoje (początkowe) próby wykorzystania nauki do określenia zachowania tego programu, ale w przyszłości powinieneś wymyślić jak najwięcej różnych hipotez i zaprojektować testy, aby rozróżnić je wszystkie przed próbą ich użycia. W przeciwnym razie skończysz się zdezorientowany i dostosujesz swój model w sposób najmniej zmian, aby wyjaśnić kolejne wyniki, aż twój model będzie tylko masą specjalnych przypadków.
wizzwizz4