Ok, então graças a @Prvt_Yadv eu pude entender os pontos. Aqui está a primeira resposta da pergunta:
Qual é a mágica por trás do segundo tr
comando?
Os 13 pontos estão simplesmente sendo mapeados para as 13 primeiras letras do segundo conjunto. então
tr .............A-Z A-ZA-Z
produzirá os seguintes conjuntos:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Se sua entrada não contiver um ponto, você poderá descartar a sequência inicial, pois não usará essa substituição. Então os sets se tornariam:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Porém, como o primeiro conjunto já contém todas as 26 letras e o conjunto2 tem a letra final repetida, elas também são descartadas e finalmente se tornam
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Qual é a substituição rot13 e idêntica ao primeiro comando (exceto por não tratar de letras minúsculas aqui). A mesma lógica pode ser aplicada ao título da pergunta:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
produziria os conjuntos:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Descartando a sequência inicial e as letras que se repetem à direita, elas se tornam:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Qual é a substituição rot3.
Agora, para a segunda pergunta:
Como fazer com que o segundo comando funcione para letras maiúsculas e minúsculas, assim como o primeiro comando?
Para fazê-lo funcionar, você coloca o número desejado de pontos no início, combinando sua rotação e 26 pontos entre a sequência superior e a inferior, da seguinte maneira:
tr ........A-Z..........................a-z A-ZA-Za-za-z
Isso criaria com sucesso um rot8 insensível. Para visualizar por que isso funciona, vamos ver os conjuntos:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Excluindo o mapeamento de pontos e as letras finais:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Agora funciona para maiúsculas e minúsculas :)
Outra maneira de fazê-lo funcionar é usar dois tr
comandos, como segue:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
Uma ressalva ao uso da substituição de pontos foi dada por @iruvar: esse comando não funcionará conforme o esperado quando a string de entrada tiver pontos. Isso ocorre porque os pontos estão sendo mapeados para outras letras e, ao fazer a substituição, tr
alterará o ponto de entrada para a última letra mapeada. Mas você pode realmente usar qualquer outro caractere que não pontos. Portanto, se o uso de pontos em seu tr
comando é um problema, você pode usá-lo @
, por exemplo. Isso funcionaria tão bem:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."