O que os pontos neste comando tr fazem: tr… AZ A-ZA-Z <<< “JVPQBOV” (com 13 pontos)

18

Eu quero usar trpara 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:

  1. Qual é a mágica por trás do segundo trcomando?
  2. Como fazer com que o segundo comando funcione para letras maiúsculas e minúsculas, assim como o primeiro comando?
Frederico Oliveira
fonte
Eu sei que há 13 pontos. O que eu quero saber é como isso funciona. Não há explicação sobre pontos no manual
Frederico Oliveira
4
é melhor esperar que você não
encontre
11
FWIW a forma mais curta tr [.*13].A-Z A-ZA-Zfunciona tão bem quantotr .............A-Z A-ZA-Z
iruvar 07/04

Respostas:

17

Funciona da seguinte maneira:

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

Então, trvai traduzir SET1para SET2.

Isso é equivalente ao primeiro, porque também é alterado por 13unidades, pois há 13 pontos.

Para incluir as letras minúsculas, você precisará organizá-las SET1com um deslocamento semelhante, ou seja:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

São 26 pontos entre Ze a, abrangendo metade das letras maiúsculas e metade das letras minúsculas. Portanto, o trcomando em si será:

tr .............A-Z..........................a-z A-ZA-Za-za-z
Prvt_Yadav
fonte
14

Como @Prvt_Yadv diz em sua resposta, funciona porque existem 13 pontos.

Os conjuntos são

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

O ponto não é um caractere especial; portanto, se você tiver um ponto em sua entrada, ele também será traduzido. Na versão trque eu tenho, é o último caractere correspondente no segundo conjunto, neste caso, um M:

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

(Eu poderia imaginar que uma versão diferente de trpoderia usar o primeiro caractere correspondente no conjunto 2, o que daria um A.)

Para responder à sua segunda pergunta , você precisa de mais 13 pontos no primeiro conjunto para "usar" as letras maiúsculas restantes no conjunto 2:

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

então você pode repetir o padrão:

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

o que nos dá:

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

E entao:

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

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:

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

com

$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
user7761803
fonte
1

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 trcomando?

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 trcomandos, 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, tralterará 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 trcomando é um problema, você pode usá-lo @, por exemplo. Isso funcionaria tão bem:

tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
Frederico Oliveira
fonte
3
Não sei ao certo como você concluiu que "os pontos são substituídos por uma sequência de letras começando de a ao número de pontos"; esse não é o caso. Não há mágica envolvida; como Prvt_Yadv explicou, existem dois conjuntos e trestá mapeando do conjunto 1 para o conjunto 2, como sempre, mas nesse caso você mapeou o caractere .para A, e também B, e também ... e também M. Isso não importa, já que sua entrada não contém a ., mas, se isso ocorresse, ela se tornaria uma M( trusa a última saída especificada para uma entrada)
Michael Mrozek
Obrigado pelo esclarecimento. Atualizei a resposta para corrigir meus erros :)
Frederico Oliveira
11
Admiro suas tentativas (iniciais) de usar a ciência para determinar o comportamento desse programa, mas no futuro você deve apresentar o maior número possível de hipóteses e elaborar testes para distinguir todos eles antes de tentar usá-los. Caso contrário, você acabará ficando confuso e adaptando o seu modelo da maneira menos alterada para explicar os resultados subseqüentes até que o seu modelo seja apenas uma massa de casos especiais.
wizzwizz4 6/04