Ok, nhờ có @Prvt_Yadv tôi đã có thể hiểu được các dấu chấm. Đây là câu trả lời đầu tiên:
Phép thuật đằng sau tr
mệnh lệnh thứ hai là gì?
13 dấu chấm đơn giản là được ánh xạ tới 13 chữ cái đầu tiên từ tập thứ hai. Vì thế
tr .............A-Z A-ZA-Z
sẽ sản xuất các bộ sau:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Nếu đầu vào của bạn không chứa dấu chấm, bạn có thể loại bỏ chuỗi ban đầu, vì bạn sẽ không sử dụng các thay thế đó. Sau đó, các bộ sẽ trở thành:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Nhưng vì bộ đầu tiên đã chứa tất cả 26 chữ cái và set2 có chữ cái lặp lại, chúng cũng bị loại bỏ, cuối cùng trở thành
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Đó là sự thay thế rot13 và giống hệt với lệnh đầu tiên (ngoại trừ việc không xử lý các trường hợp thấp hơn ở đây). Logic tương tự có thể được áp dụng cho tiêu đề của câu hỏi:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
sẽ sản xuất các bộ:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Loại bỏ chuỗi ban đầu và các chữ cái lặp đi lặp lại mà chúng trở thành:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Đó là sự thay thế rot3.
Bây giờ cho câu hỏi thứ hai:
Làm thế nào để làm cho lệnh thứ hai hoạt động cho cả chữ thường và chữ hoa, giống như lệnh thứ nhất?
Để làm cho nó hoạt động, bạn đặt số lượng chấm mong muốn ở đầu, khớp với mục của bạn và 26 dấu chấm giữa chuỗi trên và chuỗi dưới, giống như sau:
tr ........A-Z..........................a-z A-ZA-Za-za-z
Điều này sẽ thành công tạo ra một rot8 không nhạy cảm. Để hình dung tại sao điều này hoạt động, hãy xem các bộ:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Không bao gồm ánh xạ dấu chấm và chữ cái đuôi:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Bây giờ nó hoạt động cho cả chữ hoa và chữ thường :)
Một cách khác để làm cho nó hoạt động là sử dụng hai tr
lệnh như sau:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
Một cảnh báo để sử dụng thay thế dấu chấm đã được đưa ra bởi @iruvar: lệnh này sẽ không hoạt động như mong đợi khi chuỗi đầu vào có dấu chấm. Điều này là do các dấu chấm đang được ánh xạ tới các chữ cái khác và khi thực hiện thay thế, tr
sẽ thay đổi dấu chấm đầu vào thành chữ cái được ánh xạ cuối cùng. Nhưng bạn thực sự có thể sử dụng bất kỳ nhân vật nào khác ngoài dấu chấm. Vì vậy, nếu sử dụng dấu chấm trong tr
lệnh của bạn là một vấn đề, bạn có thể sử dụng @
thay thế. Điều này sẽ làm việc tốt như:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."