Saya ingin menggunakan tr
untuk 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:
- Apa keajaiban di balik
tr
perintah kedua ? - Bagaimana cara membuat perintah kedua bekerja untuk huruf besar dan kecil, sama seperti perintah pertama?
tr [.*13].A-Z A-ZA-Z
bekerja sama baiknya dengantr .............A-Z A-ZA-Z
Jawaban:
Ia bekerja sebagai berikut:
Jadi
tr
akan diterjemahkanSET1
keSET2
.Ini setara dengan yang pertama karena juga bergeser oleh
13
unit karena ada 13 titik.Untuk memasukkan huruf kecil, Anda harus mengaturnya
SET1
dengan offset yang sama, yaitu:Itu 26 titik antara
Z
dana
, yang mencakup setengah huruf besar dan setengah huruf kecil. Jaditr
perintah itu sendiri adalah:sumber
Seperti @Prvt_Yadv mengatakan dalam jawaban mereka, ini berhasil karena ada 13 titik.
Set adalah
Titik bukanlah karakter khusus, jadi jika Anda memiliki titik di input Anda, itu akan diterjemahkan juga. Dalam versi
tr
yang saya miliki, itu adalah karakter yang sesuai terakhir di set kedua, dalam hal ini anM
:(Saya bisa membayangkan bahwa versi yang berbeda
tr
mungkin menggunakan karakter yang cocok pertama di set 2, yang akan memberikanA
.)Untuk menjawab pertanyaan kedua , Anda perlu 13 titik di set pertama untuk "menggunakan" huruf besar yang tersisa di set 2:
maka Anda dapat mengulangi polanya:
yang memberi kita:
Dan sebagainya:
Secara pribadi, saya pikir cara pertama melakukannya dalam pertanyaan Anda lebih sederhana!
Cara pertama juga tidak mengubah karakter lain dalam input. Sebagai contoh, bandingkan:
dengan
sumber
Ok, jadi terima kasih kepada @Prvt_Yadv saya bisa mengerti titik-titiknya. Inilah jawaban pertanyaan pertama:
13 titik hanya dipetakan ke 13 huruf pertama dari set kedua. Begitu
tr .............A-Z A-ZA-Z
akan menghasilkan set berikut:Jika input Anda tidak mengandung titik, Anda dapat membuang urutan awal, karena Anda tidak akan menggunakan substitusi itu. Maka set akan menjadi:
Tapi karena set pertama sudah berisi semua 26 huruf dan set2 telah mengulangi huruf trailing, mereka juga dibuang, akhirnya menjadi
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:Membuang urutan awal dan huruf berulang berulang menjadi:
Yang merupakan substitusi rot3.
Sekarang untuk pertanyaan kedua:
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:
Ini akan berhasil membuat rot8 tidak sensitif. Untuk memvisualisasikan mengapa ini berhasil, mari kita lihat set:
Tidak termasuk pemetaan titik dan huruf trailing:
Sekarang berfungsi untuk huruf besar dan kecil :)
Cara lain untuk membuatnya berfungsi adalah dengan menggunakan dua
tr
perintah sebagai berikut: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,
tr
akan mengubah titik input ke huruf yang terakhir dipetakan. Tetapi Anda benar-benar dapat menggunakan karakter lain selain titik. Jadi, jika menggunakan titik-titik dalamtr
perintah Anda merupakan masalah, Anda dapat menggunakan@
sebagai gantinya, misalnya. Ini akan bekerja dengan baik:sumber
tr
merupakan pemetaan dari set 1 untuk mengatur 2, seperti biasa, tetapi dalam kasus ini Anda sudah dipetakan karakter.
untukA
, dan jugaB
, dan juga ..., dan jugaM
. Ini tidak masalah karena input Anda tidak mengandung a.
, tetapi jika itu berubah akan menjadiM
(tr
menggunakan output terakhir yang Anda tentukan untuk input yang diberikan)