Je veux utiliser tr
pour 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:
- Quelle est la magie derrière la deuxième
tr
commande? - Comment faire fonctionner la deuxième commande pour les minuscules et les majuscules, tout comme la première commande?
tr [.*13].A-Z A-ZA-Z
fonctionne aussi bien quetr .............A-Z A-ZA-Z
Réponses:
Cela fonctionne comme suit:
Ainsi
tr
se traduiraSET1
enSET2
.Cela équivaut au premier car il est également décalé d'
13
unités car il y a 13 points.Pour inclure les lettres minuscules, vous devrez les disposer
SET1
avec un décalage similaire, c'est-à-dire:Cela représente 26 points entre
Z
eta
, couvrant la moitié de l'alphabet majuscule et la moitié de l'alphabet minuscule. Latr
commande elle-même sera donc:la source
Comme @Prvt_Yadv le dit dans sa réponse, cela fonctionne car il y a 13 points.
Les ensembles sont
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
tr
que j'ai, c'est le dernier caractère correspondant dans le deuxième jeu, dans ce cas unM
:(Je pourrais imaginer qu'une version différente de
tr
pourrait utiliser le premier caractère correspondant dans l'ensemble 2, ce qui donnerait unA
.)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:
alors vous pouvez répéter le modèle:
ce qui nous donne:
Et donc:
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:
avec
la source
Ok, donc grâce à @Prvt_Yadv j'ai pu comprendre les points. Voici la première réponse à la question:
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: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:
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
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:En éliminant la séquence initiale et les lettres répétitives de fin, elles deviennent:
Quelle est la substitution rot3.
Maintenant pour la deuxième question:
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:
Cela créerait avec succès une rot8 insensible. Pour visualiser pourquoi cela fonctionne, voyons les ensembles:
À l'exclusion de la cartographie des points et des lettres de fin:
Maintenant, cela fonctionne pour les majuscules et les minuscules :)
Une autre façon de le faire fonctionner consiste à utiliser deux
tr
commandes comme suit:@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,
tr
changera 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 votretr
commande pose problème, vous pouvez utiliser à la@
place, par exemple. Cela fonctionnerait tout aussi bien:la source
tr
mappe de l'ensemble 1 à l'ensemble 2, comme toujours, mais dans ce cas, vous avez mappé le personnage.
àA
, et aussiB
, et aussi ..., et aussiM
. 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 unM
(tr
utilise la dernière sortie que vous spécifiez pour une entrée donnée)