Apa yang dilakukan titik-titik dalam perintah tr ini: tr ... AZ A-ZA-Z <<< “JVPQBOV” (dengan 13 titik)

18

Saya ingin menggunakan truntuk melakukan beberapa transformasi rot13. Saya dapat dengan indah memahami perintah ini:

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

keluaran mana HELP ME PLEASE, tapi saya tidak tahu bagaimana perintah lain ini dapat menghasilkan transformasi rot13 yang sama:

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

Jadi saya punya dua pertanyaan:

  1. Apa keajaiban di balik trperintah kedua ?
  2. Bagaimana cara membuat perintah kedua bekerja untuk huruf besar dan kecil, sama seperti perintah pertama?
Frederico Oliveira
sumber
Saya tahu ada 13 titik. Yang ingin saya tahu adalah cara kerjanya. Tidak ada penjelasan tentang titik-titik di manual
Frederico Oliveira
4
Anda lebih baik berharap Anda tidak mengalami titik di teks input Anda
iruvar
1
FWIW bentuk yang lebih pendek tr [.*13].A-Z A-ZA-Zbekerja sama baiknya dengantr .............A-Z A-ZA-Z
iruvar

Jawaban:

17

Ia bekerja sebagai berikut:

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

Jadi trakan diterjemahkan SET1ke SET2.

Ini setara dengan yang pertama karena juga bergeser oleh 13unit karena ada 13 titik.

Untuk memasukkan huruf kecil, Anda harus mengaturnya SET1dengan offset yang sama, yaitu:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Itu 26 titik antara Zdan a, yang mencakup setengah huruf besar dan setengah huruf kecil. Jadi trperintah itu sendiri adalah:

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

Seperti @Prvt_Yadv mengatakan dalam jawaban mereka, ini berhasil karena ada 13 titik.

Set adalah

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

Titik bukanlah karakter khusus, jadi jika Anda memiliki titik di input Anda, itu akan diterjemahkan juga. Dalam versi tryang saya miliki, itu adalah karakter yang sesuai terakhir di set kedua, dalam hal ini an M:

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

(Saya bisa membayangkan bahwa versi yang berbeda trmungkin menggunakan karakter yang cocok pertama di set 2, yang akan memberikan A.)

Untuk menjawab pertanyaan kedua , Anda perlu 13 titik di set pertama untuk "menggunakan" huruf besar yang tersisa di set 2:

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

maka Anda dapat mengulangi polanya:

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

yang memberi kita:

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

Dan sebagainya:

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

Secara pribadi, saya pikir cara pertama melakukannya dalam pertanyaan Anda lebih sederhana!

Cara pertama juga tidak mengubah karakter lain dalam input. Sebagai contoh, bandingkan:

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

dengan

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

Ok, jadi terima kasih kepada @Prvt_Yadv saya bisa mengerti titik-titiknya. Inilah jawaban pertanyaan pertama:

Apa keajaiban di balik trperintah kedua ?

13 titik hanya dipetakan ke 13 huruf pertama dari set kedua. Begitu

tr .............A-Z A-ZA-Z akan menghasilkan set berikut:

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

Jika input Anda tidak mengandung titik, Anda dapat membuang urutan awal, karena Anda tidak akan menggunakan substitusi itu. Maka set akan menjadi:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Tapi karena set pertama sudah berisi semua 26 huruf dan set2 telah mengulangi huruf trailing, mereka juga dibuang, akhirnya menjadi

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM

Yang merupakan substitusi rot13 dan identik dengan perintah pertama (kecuali untuk tidak berurusan dengan huruf kecil di sini). Logika yang sama dapat diterapkan untuk judul pertanyaan:

tr ...A-Z A-ZA-Z <<< “JVPQBOV” akan menghasilkan set:

SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ

Membuang urutan awal dan huruf berulang berulang menjadi:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC

Yang merupakan substitusi rot3.

Sekarang untuk pertanyaan kedua:

Bagaimana cara membuat perintah kedua bekerja untuk huruf besar dan kecil, sama seperti perintah pertama?

Untuk membuatnya berfungsi, Anda meletakkan jumlah titik yang diinginkan di awal, mencocokkan busuk Anda dan 26 titik antara urutan atas dan urutan bawah, seperti ini:

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

Ini akan berhasil membuat rot8 tidak sensitif. Untuk memvisualisasikan mengapa ini berhasil, mari kita lihat set:

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

Tidak termasuk pemetaan titik dan huruf trailing:

SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh

Sekarang berfungsi untuk huruf besar dan kecil :)

Cara lain untuk membuatnya berfungsi adalah dengan menggunakan dua trperintah sebagai berikut:

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

Peringatan untuk menggunakan penggantian titik diberikan oleh @iruvar: perintah ini tidak akan berfungsi seperti yang diharapkan ketika string input memiliki titik-titik. Ini karena titik-titik sedang dipetakan ke huruf lain dan ketika melakukan substitusi, trakan mengubah titik input ke huruf yang terakhir dipetakan. Tetapi Anda benar-benar dapat menggunakan karakter lain selain titik. Jadi, jika menggunakan titik-titik dalam trperintah Anda merupakan masalah, Anda dapat menggunakan @sebagai gantinya, misalnya. Ini akan bekerja dengan baik:

tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
Frederico Oliveira
sumber
3
Saya tidak yakin bagaimana Anda menyimpulkan bahwa "titik diganti dengan urutan huruf mulai dari a hingga jumlah titik"; itu sama sekali tidak terjadi. Tidak ada sihir yang terlibat; sebagai Prvt_Yadv menjelaskan, ada dua set dan trmerupakan pemetaan dari set 1 untuk mengatur 2, seperti biasa, tetapi dalam kasus ini Anda sudah dipetakan karakter .untuk A, dan juga B, dan juga ..., dan juga M. Ini tidak masalah karena input Anda tidak mengandung a ., tetapi jika itu berubah akan menjadi M( trmenggunakan output terakhir yang Anda tentukan untuk input yang diberikan)
Michael Mrozek
Terimakasih atas klarifikasinya. Saya telah memperbarui jawaban untuk memperbaiki kesalahan saya :)
Frederico Oliveira
1
Saya mengagumi upaya (awal) Anda untuk menggunakan sains untuk menentukan perilaku program ini, tetapi di masa depan Anda harus memunculkan sebanyak mungkin hipotesis berbeda dan merancang tes untuk membedakan semuanya sebelum mencoba menggunakannya. Kalau tidak, Anda akhirnya menjadi bingung, dan mengadaptasi model Anda dengan cara yang paling tidak berubah untuk menjelaskan hasil selanjutnya sampai model Anda hanya sekumpulan kasus khusus.
wizzwizz4