Quiero usar tr
para hacer una transformación rot13. Puedo entender muy bien este comando:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
qué salida es HELP ME PLEASE
, pero no puedo entender cómo este otro comando puede producir la misma transformación rot13:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
Entonces tengo dos preguntas:
- ¿Cuál es la magia detrás del segundo
tr
comando? - ¿Cómo hacer que el segundo comando funcione para minúsculas y mayúsculas, al igual que el primer comando?
tr [.*13].A-Z A-ZA-Z
funciona tan bien comotr .............A-Z A-ZA-Z
Respuestas:
Funciona de la siguiente manera:
Entonces
tr
se traduciráSET1
aSET2
.Esto es equivalente al primero porque también está cambiando por
13
unidades ya que hay 13 puntos.Para incluir las letras minúsculas, tendrá que organizarlas
SET1
con un desplazamiento similar, es decir:Eso es 26 puntos entre
Z
ya
, abarcando la mitad del alfabeto en mayúsculas y la mitad en minúsculas. Entonces eltr
comando en sí será:fuente
Como @Prvt_Yadv dice en su respuesta, funciona porque hay 13 puntos.
Los conjuntos son
El punto no es un carácter especial, por lo que si tiene un punto en su entrada, también se traducirá. En la versión
tr
que tengo, es el último personaje correspondiente en el segundo conjunto, en este caso unM
:(Me imagino que una versión diferente de
tr
podría usar el primer carácter coincidente en el conjunto 2, lo que daría unA
.)Para responder a su segunda pregunta , necesita otros 13 puntos en el primer conjunto para "agotar" las letras mayúsculas restantes en el conjunto 2:
entonces puedes repetir el patrón:
lo que nos da:
Y entonces:
Personalmente, creo que la primera forma de hacerlo en tu pregunta es más simple.
La primera forma tampoco transforma ningún otro carácter en la entrada. Por ejemplo, compare:
con
fuente
Ok, así que gracias a @Prvt_Yadv pude entender los puntos. Aquí está la primera pregunta respuesta:
Los 13 puntos simplemente se asignan a las primeras 13 letras del segundo conjunto. Entonces
tr .............A-Z A-ZA-Z
producirá los siguientes conjuntos:Si su entrada no contiene un punto, puede descartar la secuencia inicial, ya que no usará esa sustitución. Entonces los conjuntos se convertirían en:
Pero dado que el primer conjunto ya contiene las 26 letras y el set2 tiene letras finales repetitivas, también se descartan y finalmente se convierten en
Cuál es la sustitución rot13 e idéntica al primer comando (excepto por no tratar con minúsculas aquí). La misma lógica se puede aplicar para el título de la pregunta:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
produciría los conjuntos:Descartando la secuencia inicial y las letras repetidas finales se convierten en:
Cuál es la sustitución rot3.
Ahora para la segunda pregunta:
Para que funcione, coloque el número deseado de puntos al principio, haciendo coincidir su podredumbre y 26 puntos entre la secuencia superior y la secuencia inferior, así:
Esto crearía con éxito una podredumbre insensible8. Para visualizar por qué esto funciona, veamos los conjuntos:
Excluyendo el mapeo de puntos y las letras finales:
Ahora funciona para mayúsculas y minúsculas :)
Otra forma de hacerlo funcionar es usar dos
tr
comandos de la siguiente manera:@Iruvar dio una advertencia sobre el uso de la sustitución de puntos: este comando no funcionará como se esperaba cuando la cadena de entrada tiene puntos. Esto se debe a que los puntos se asignan a otras letras y al realizar la sustitución,
tr
cambiará el punto de entrada a la última letra asignada. Pero en realidad puedes usar cualquier otro personaje que no sean puntos. Entonces, si usar puntos en sutr
comando es un problema, puede usarlo@
, por ejemplo. Esto funcionaría igual de bien:fuente
tr
está asignando del conjunto 1 al conjunto 2, como siempre, pero en este caso ha asignado el carácter.
aA
, y tambiénB
, y también ..., y tambiénM
. Esto no importa ya que su entrada no contiene un.
, pero si lo hiciera se convertiría en unM
(tr
usa la última salida que especifique para una entrada dada)