Eu quero usar tr
para fazer alguma transformação rot13. Eu posso entender lindamente este comando:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
qual saída é HELP ME PLEASE
, mas não consigo descobrir como esse outro comando pode produzir a mesma transformação rot13:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
Então eu tenho duas perguntas:
- Qual é a mágica por trás do segundo
tr
comando? - Como fazer o segundo comando funcionar para letras minúsculas e maiúsculas, assim como o primeiro comando?
Funciona da seguinte forma:
Então
tr
vai traduzirSET1
paraSET2
.Isso é equivalente ao primeiro porque também está mudando por
13
unidades, pois há 13 pontos.Para incluir as letras minúsculas, você terá que organizá-las
SET1
com um deslocamento semelhante, ou seja:São 26 pontos entre
Z
ea
, abrangendo metade do alfabeto maiúsculo e metade do alfabeto minúsculo. Então otr
comando em si será:Como @Prvt_Yadv diz em sua resposta, funciona porque existem 13 pontos.
Os conjuntos são
O ponto não é um caractere especial, portanto, se você tiver um ponto em sua entrada, ele também será traduzido. Na versão
tr
que eu tenho, é o último caractere correspondente no segundo conjunto, neste caso umM
:(Eu poderia imaginar que uma versão diferente de
tr
poderia usar o primeiro caractere correspondente no conjunto 2, o que daria umA
.)Para responder à sua segunda pergunta , você precisa de mais 13 pontos no primeiro conjunto para "usar" as letras maiúsculas restantes no conjunto 2:
então você pode repetir o padrão:
que nos dá:
E entao:
Pessoalmente, acho que a primeira maneira de fazer isso na sua pergunta é mais simples!
A primeira maneira também não transforma nenhum outro caractere na entrada. Por exemplo, compare:
com
Ok, então, graças a @Prvt_Yadv, consegui entender os pontos. Aqui está a resposta da primeira pergunta:
Os 13 pontos estão simplesmente sendo mapeados para as primeiras 13 letras do segundo conjunto. Então
tr .............A-Z A-ZA-Z
produzirá os seguintes conjuntos:Se sua entrada não contiver um ponto, você pode descartar a sequência inicial, pois não usará essas substituições. Então os conjuntos se tornariam:
Mas como o primeiro conjunto já contém todas as 26 letras e o conjunto2 tem letras repetidas à direita, essas também são descartadas, tornando-se finalmente
Que é a substituição rot13 e idêntica ao primeiro comando (exceto por não lidar com letras minúsculas aqui). A mesma lógica pode ser aplicada para o título da pergunta:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
produziria os conjuntos:Descartando a sequência inicial e as letras repetidas à direita, elas se tornam:
Qual é a substituição rot3.
Agora a segunda pergunta:
Para fazer funcionar você coloca o número desejado de pontos no início, combinando sua rot e 26 pontos entre a sequência superior e a sequência inferior, assim:
Isso criaria com sucesso um rot8 insensível. Para visualizar por que isso funciona, vamos ver os conjuntos:
Excluindo o mapeamento de pontos e letras à direita:
Agora funciona para maiúsculas e minúsculas :)
Outra maneira de fazê-lo funcionar é usar dois
tr
comandos como segue:Uma advertência para usar a substituição de pontos foi dada por @iruvar: este 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
irá alterar o ponto de entrada para a última letra mapeada. Mas você pode realmente usar qualquer outro caractere além de pontos. Portanto, se usar pontos em seutr
comando é um problema, você pode usar@
, por exemplo. Isso funcionaria tão bem: