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 com que o segundo comando funcione para letras maiúsculas e minúsculas, assim como o primeiro comando?
tr [.*13].A-Z A-ZA-Z
funciona tão bem quantotr .............A-Z A-ZA-Z
Respostas:
Funciona da seguinte maneira:
Então,
tr
vai traduzirSET1
paraSET2
.Isso é equivalente ao primeiro, porque também é alterado por
13
unidades, pois há 13 pontos.Para incluir as letras minúsculas, você precisará organizá-las
SET1
com um deslocamento semelhante, ou seja:São 26 pontos entre
Z
ea
, abrangendo metade das letras maiúsculas e metade das letras minúsculas. Portanto, otr
comando em si será:fonte
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:
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 outros caracteres na entrada. Por exemplo, compare:
com
fonte
Ok, então graças a @Prvt_Yadv eu pude entender os pontos. Aqui está a primeira resposta da pergunta:
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: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:
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
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:Descartando a sequência inicial e as letras que se repetem à direita, elas se tornam:
Qual é a substituição rot3.
Agora, para a segunda pergunta:
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:
Isso criaria com sucesso um rot8 insensível. Para visualizar por que isso funciona, vamos ver os conjuntos:
Excluindo o mapeamento de pontos e as letras finais:
Agora funciona para maiúsculas e minúsculas :)
Outra maneira de fazê-lo funcionar é usar dois
tr
comandos, como segue: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 seutr
comando é um problema, você pode usá-lo@
, por exemplo. Isso funcionaria tão bem:fonte
tr
está mapeando do conjunto 1 para o conjunto 2, como sempre, mas nesse caso você mapeou o caractere.
paraA
, e tambémB
, e também ... e tambémM
. Isso não importa, já que sua entrada não contém a.
, mas, se isso ocorresse, ela se tornaria umaM
(tr
usa a última saída especificada para uma entrada)