Que font les points de cette commande tr: tr… AZ A-ZA-Z <<< “JVPQBOV” (avec 13 points)

18

Je veux utiliser trpour faire une transformation rot13. Je peux parfaitement comprendre cette commande:

tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"

quelle sortie est HELP ME PLEASE, mais je ne peux pas comprendre comment cette autre commande peut produire la même transformation rot13:

tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"

J'ai donc deux questions:

  1. Quelle est la magie derrière la deuxième trcommande?
  2. Comment faire fonctionner la deuxième commande pour les minuscules et les majuscules, tout comme la première commande?
Frederico Oliveira
la source
Je sais qu'il y a 13 points. Ce que je veux savoir, c'est comment cela fonctionne. Il n'y a aucune explication sur les points dans le manuel
Frederico Oliveira
4
vous feriez mieux d'espérer que vous ne rencontrez pas un point dans votre texte d'entrée
iruvar
1
FWIW la forme courte tr [.*13].A-Z A-ZA-Zfonctionne aussi bien quetr .............A-Z A-ZA-Z
iruvar

Réponses:

17

Cela fonctionne comme suit:

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

Ainsi trse traduira SET1en SET2.

Cela équivaut au premier car il est également décalé d' 13unités car il y a 13 points.

Pour inclure les lettres minuscules, vous devrez les disposer SET1avec un décalage similaire, c'est-à-dire:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Cela représente 26 points entre Zet a, couvrant la moitié de l'alphabet majuscule et la moitié de l'alphabet minuscule. La trcommande elle-même sera donc:

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

Comme @Prvt_Yadv le dit dans sa réponse, cela fonctionne car il y a 13 points.

Les ensembles sont

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

Le point n'est pas un caractère spécial, donc si vous avez un point dans votre entrée, il sera également traduit. Dans la version trque j'ai, c'est le dernier caractère correspondant dans le deuxième jeu, dans ce cas un M:

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

(Je pourrais imaginer qu'une version différente de trpourrait utiliser le premier caractère correspondant dans l'ensemble 2, ce qui donnerait un A.)

Pour répondre à votre deuxième question , vous avez besoin de 13 autres points dans le premier ensemble pour "utiliser" les lettres majuscules restantes de l'ensemble 2:

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

alors vous pouvez répéter le modèle:

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

ce qui nous donne:

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

Et donc:

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

Personnellement, je pense que la première façon de le faire dans votre question est plus simple!

La première manière ne transforme pas non plus d'autres caractères dans l'entrée. Par exemple, comparez:

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

avec

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

Ok, donc grâce à @Prvt_Yadv j'ai pu comprendre les points. Voici la première réponse à la question:

Quelle est la magie derrière la deuxième trcommande?

Les 13 points sont simplement mis en correspondance avec les 13 premières lettres du deuxième ensemble. Donc

tr .............A-Z A-ZA-Z produira les ensembles suivants:

SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Si votre entrée ne contient pas de point, vous pouvez ignorer la séquence initiale, car vous n'utiliserez pas ces substitutions. Les ensembles deviendraient alors:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Mais comme le premier ensemble contient déjà les 26 lettres et que set2 a une lettre de fin répétitive, celles-ci sont également éliminées, devenant finalement

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM

Qui est la substitution rot13 et identique à la première commande (sauf pour ne pas traiter les minuscules ici). La même logique peut être appliquée pour le titre de la question:

tr ...A-Z A-ZA-Z <<< “JVPQBOV” produirait les ensembles:

SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

En éliminant la séquence initiale et les lettres répétitives de fin, elles deviennent:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC

Quelle est la substitution rot3.

Maintenant pour la deuxième question:

Comment faire fonctionner la deuxième commande pour les minuscules et les majuscules, tout comme la première commande?

Pour le faire fonctionner, vous mettez le nombre de points souhaité au début, en faisant correspondre votre pourriture et 26 points entre la séquence supérieure et la séquence inférieure, comme ceci:

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

Cela créerait avec succès une rot8 insensible. Pour visualiser pourquoi cela fonctionne, voyons les ensembles:

SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz

À l'exclusion de la cartographie des points et des lettres de fin:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh

Maintenant, cela fonctionne pour les majuscules et les minuscules :)

Une autre façon de le faire fonctionner consiste à utiliser deux trcommandes comme suit:

tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z

@Iruvar a mis en garde contre l'utilisation de la substitution de points: cette commande ne fonctionnera pas comme prévu lorsque la chaîne d'entrée a des points. Cela est dû au fait que les points sont mappés à d'autres lettres et lors de la substitution, trchangera le point d'entrée à la dernière lettre mappée. Mais vous pouvez réellement utiliser n'importe quel autre caractère que des points. Ainsi, si l'utilisation de points dans votre trcommande pose problème, vous pouvez utiliser à la @place, par exemple. Cela fonctionnerait tout aussi bien:

tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
Frederico Oliveira
la source
3
Je ne sais pas comment vous avez conclu que "les points sont remplacés par une séquence de lettres commençant de a au nombre de points"; ce n'est pas du tout le cas. Il n'y a pas de magie impliquée; comme l'explique Prvt_Yadv, il y a deux ensembles et trmappe de l'ensemble 1 à l'ensemble 2, comme toujours, mais dans ce cas, vous avez mappé le personnage .à A, et aussi B, et aussi ..., et aussi M. Cela n'a pas d'importance car votre entrée ne contient pas de a ., mais si c'était le cas, elle se transformerait en un M( trutilise la dernière sortie que vous spécifiez pour une entrée donnée)
Michael Mrozek
Merci pour la clarification. J'ai mis à jour la réponse pour corriger mes erreurs :)
Frederico Oliveira
1
J'admire vos tentatives (initiales) d'utiliser la science pour déterminer le comportement de ce programme, mais à l'avenir, vous devriez proposer autant d'hypothèses différentes que possible et concevoir des tests pour les distinguer toutes avant d' essayer de les utiliser. Sinon, vous finissez par être confus et vous adaptez votre modèle de la manière la moins modifiée pour expliquer les résultats ultérieurs jusqu'à ce que votre modèle ne soit qu'une masse de cas spéciaux.
wizzwizz4