¿Qué hacen los puntos en este comando tr: tr… AZ A-ZA-Z <<< “JVPQBOV” (con 13 puntos)


18

Quiero usar trpara 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:

  1. ¿Cuál es la magia detrás del segundo trcomando?
  2. ¿Cómo hacer que el segundo comando funcione para minúsculas y mayúsculas, al igual que el primer comando?

Sé que hay 13 puntos. Lo que quiero saber es cómo funciona. No hay explicación sobre los puntos en el manual
Frederico Oliveira

44
es mejor que espere no encontrarse con un punto en su texto de entrada
iruvar

1
FWIW la forma más corta tr [.*13].A-Z A-ZA-Zfunciona tan bien comotr .............A-Z A-ZA-Z
iruvar

Respuestas:


17

Funciona de la siguiente manera:

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

Entonces trse traducirá SET1a SET2.

Esto es equivalente al primero porque también está cambiando por 13unidades ya que hay 13 puntos.

Para incluir las letras minúsculas, tendrá que organizarlas SET1con un desplazamiento similar, es decir:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Eso es 26 puntos entre Zy a, abarcando la mitad del alfabeto en mayúsculas y la mitad en minúsculas. Entonces el trcomando en sí será:

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

14

Como @Prvt_Yadv dice en su respuesta, funciona porque hay 13 puntos.

Los conjuntos son

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

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 trque tengo, es el último personaje correspondiente en el segundo conjunto, en este caso un M:

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

(Me imagino que una versión diferente de trpodría usar el primer carácter coincidente en el conjunto 2, lo que daría un A.)

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:

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

entonces puedes repetir el patrón:

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

lo que nos da:

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

Y entonces:

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

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:

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

con

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

1

Ok, así que gracias a @Prvt_Yadv pude entender los puntos. Aquí está la primera pregunta respuesta:

¿Cuál es la magia detrás del segundo trcomando?

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:

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

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:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

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

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM

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:

SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Descartando la secuencia inicial y las letras repetidas finales se convierten en:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC

Cuál es la sustitución rot3.

Ahora para la segunda pregunta:

¿Cómo hacer que el segundo comando funcione para minúsculas y mayúsculas, al igual que el primer comando?

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í:

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

Esto crearía con éxito una podredumbre insensible8. Para visualizar por qué esto funciona, veamos los conjuntos:

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

Excluyendo el mapeo de puntos y las letras finales:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh

Ahora funciona para mayúsculas y minúsculas :)

Otra forma de hacerlo funcionar es usar dos trcomandos de la siguiente manera:

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

@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, trcambiará 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 su trcomando es un problema, puede usarlo @, por ejemplo. Esto funcionaría igual de bien:

tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."

3
No estoy seguro de cómo llegó a la conclusión de que "los puntos se reemplazan por una secuencia de letras que comienzan desde a hasta el número de puntos"; ese no es el caso en absoluto. No hay magia involucrada; Como explicó Prvt_Yadv, hay dos conjuntos y trestá asignando del conjunto 1 al conjunto 2, como siempre, pero en este caso ha asignado el carácter .a A, y también B, y también ..., y también M. Esto no importa ya que su entrada no contiene un ., pero si lo hiciera se convertiría en un M( trusa la última salida que especifique para una entrada dada)
Michael Mrozek

Gracias por la aclaración. He actualizado la respuesta para corregir mis errores :)
Frederico Oliveira

1
Admiro tus intentos (iniciales) de usar la ciencia para determinar el comportamiento de este programa, pero en el futuro deberías proponer tantas hipótesis diferentes como sea posible y diseñar pruebas para distinguirlas antes de intentar usarlas. De lo contrario, terminará confundiéndose y adaptando su modelo de la manera menos cambiante para explicar los resultados posteriores hasta que su modelo sea solo una masa de casos especiales.
wizzwizz4
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.