Cosa fanno i punti in questo comando tr: tr… AZ A-ZA-Z <<< “JVPQBOV” (con 13 punti)


18

Voglio usare trper fare qualche trasformazione rot13. Riesco a comprendere perfettamente questo comando:

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

quale output è HELP ME PLEASE, ma non riesco a capire come questo altro comando possa produrre la stessa trasformazione rot13:

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

Quindi ho due domande:

  1. Qual è la magia dietro il secondo trcomando?
  2. Come far funzionare il secondo comando sia in minuscolo che maiuscolo, proprio come il primo comando?

So che ci sono 13 punti. Quello che voglio sapere è come funziona. Non ci sono spiegazioni sui punti nel manuale
Frederico Oliveira il

4
faresti meglio a sperare di non imbatterti in un punto nel testo di input
iruvar

1
FWIW la forma più corta tr [.*13].A-Z A-ZA-Zfunziona altrettanto benetr .............A-Z A-ZA-Z
iruvar

Risposte:


17

Funziona come segue:

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

Quindi trsi tradurrà SET1in SET2.

Ciò equivale al primo perché si sta anche spostando di 13unità in quanto vi sono 13 punti.

Per includere le lettere minuscole, dovrai disporle SET1con un offset simile, ovvero:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Sono 26 punti tra Ze a, che coprono metà dell'alfabeto maiuscolo e metà dell'alfabeto minuscolo. Quindi il trcomando stesso sarà:

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

14

Come dice @Prvt_Yadv nella loro risposta, funziona perché ci sono 13 punti.

I set sono

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

Il punto non è un carattere speciale, quindi se hai un punto nel tuo input, verrà tradotto anche. Nella versione trche ho, è l'ultimo personaggio corrispondente nel secondo set, in questo caso un M:

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

(Potrei immaginare che una versione diversa di trpotrebbe usare il primo personaggio corrispondente nel set 2, che darebbe un A.)

Per rispondere alla tua seconda domanda , hai bisogno di altri 13 punti nel primo set per "utilizzare" le lettere maiuscole rimanenti nel set 2:

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

quindi puoi ripetere lo schema:

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

che ci dà:

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

E così:

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

Personalmente, penso che il primo modo di farlo nella tua domanda sia più semplice!

Il primo modo inoltre non trasforma altri caratteri nell'input. Ad esempio, confronta:

$ 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, quindi grazie a @Prvt_Yadv sono stato in grado di capire i punti. Ecco la prima risposta alla domanda:

Qual è la magia dietro il secondo trcomando?

I 13 punti vengono semplicemente associati alle prime 13 lettere del secondo set. Così

tr .............A-Z A-ZA-Z produrrà i seguenti set:

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

Se il tuo input non contiene un punto, puoi scartare la sequenza iniziale, dal momento che non userai quella sostituzione. Quindi i set diventerebbero:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Ma poiché il primo set contiene già tutte e 26 le lettere e set2 ha ripetute lettere finali, anche quelle vengono scartate, diventando infine

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM

Qual è la sostituzione di rot13 e identica al primo comando (eccetto per non trattare qui le minuscole). La stessa logica può essere applicata per il titolo della domanda:

tr ...A-Z A-ZA-Z <<< “JVPQBOV” produrrebbe i set:

SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Scartando la sequenza iniziale e le lettere ripetute finali diventano:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC

Qual è la sostituzione di rot3.

Ora per la seconda domanda:

Come far funzionare il secondo comando sia in minuscolo che maiuscolo, proprio come il primo comando?

Per farlo funzionare, inserisci il numero desiderato di punti all'inizio, facendo corrispondere il tuo marciume e 26 punti tra la sequenza superiore e la sequenza inferiore, proprio in questo modo:

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

Ciò creerebbe con successo un rot8 insensibile. Per visualizzare perché funziona, vediamo i set:

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

Escludendo la mappatura dei punti e le lettere finali:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh

Ora funziona sia in maiuscolo che in minuscolo :)

Un altro modo per farlo funzionare è usare due trcomandi come segue:

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

Un avvertimento sull'uso della sostituzione dei punti è stato dato da @iruvar: questo comando non funzionerà come previsto quando la stringa di input ha punti. Questo perché i punti vengono mappati su altre lettere e quando si esegue la sostituzione, tril punto di input verrà modificato sull'ultima lettera mappata. Ma puoi effettivamente usare qualsiasi altro personaggio oltre ai punti. Pertanto, se l'utilizzo dei punti nel trcomando è un problema, è possibile utilizzare @invece, ad esempio. Funzionerebbe altrettanto bene:

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

3
Non sono sicuro di come tu abbia concluso che "i punti sono sostituiti da una sequenza di lettere che inizia da a al numero di punti"; non è affatto così. Non c'è magia coinvolta; come ha spiegato Prvt_Yadv, ci sono due set e trsta mappando dal set 1 al set 2, come sempre, ma in questo caso hai mappato il carattere .a A, e anche B, e anche ..., e anche M. Questo non importa dal momento che il tuo input non contiene un ., ma se lo facesse si trasformerebbe in un M( trusa l'ultimo output specificato per un determinato input)
Michael Mrozek

Grazie per il chiarimento. Ho aggiornato la risposta per correggere i miei errori :)
Frederico Oliveira il

1
Ammiro i tuoi (iniziali) tentativi di usare la scienza per determinare il comportamento di questo programma, ma in futuro dovresti trovare quante più ipotesi possibili e test di progettazione per distinguerli tra tutti prima di provare a usarli. Altrimenti finirai per confonderti e adattare il tuo modello in un modo di minimo cambiamento per spiegare i risultati successivi fino a quando il tuo modello non è solo una massa di casi speciali.
wizzwizz4,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.