Các dấu chấm trong lệnh tr này làm gì: trầu AZ A-ZA-Z <<< Phiên bản JVPQBOV (có 13 dấu chấm)


18

Tôi muốn sử dụng trđể thực hiện một số chuyển đổi rot13. Tôi có thể hiểu rõ lệnh này:

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

đầu ra nào HELP ME PLEASE, nhưng tôi không thể hiểu làm thế nào lệnh khác này có thể tạo ra phép biến đổi rot13 tương tự:

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

Vì vậy, tôi có hai câu hỏi:

  1. Phép thuật đằng sau trmệnh lệnh thứ hai là gì?
  2. 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?

Tôi biết có 13 chấm. Những gì tôi muốn biết là làm thế nào nó hoạt động. Không có lời giải thích nào về các dấu chấm trong hướng dẫn
Frederico Oliveira

4
bạn tốt hơn hy vọng bạn không gặp phải một dấu chấm trong văn bản đầu vào của bạn
iruvar

1
FWIW hình thức ngắn hơn tr [.*13].A-Z A-ZA-Zhoạt động tốt nhưtr .............A-Z A-ZA-Z
iruvar

Câu trả lời:


17

Nó hoạt động như sau:

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

Vậy trsẽ dịch SET1sang SET2.

Điều này tương đương với cái đầu tiên bởi vì nó cũng thay đổi theo 13đơn vị khi có 13 chấm.

Để bao gồm các chữ cái viết thường, bạn sẽ phải sắp xếp chúng SET1với một phần bù tương tự, nghĩa là:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

Đó là 26 dấu chấm giữa Za, kéo dài một nửa chữ hoa và một nửa chữ cái viết thường. Vì vậy, trlệnh sẽ là:

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

14

Như @Prvt_Yadv nói trong câu trả lời của họ, nó hoạt động vì có 13 dấu chấm.

Các bộ là

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

Dấu chấm không phải là một ký tự đặc biệt, vì vậy nếu bạn có một dấu chấm trong đầu vào của mình, nó cũng sẽ được dịch. Trong phiên bản trmà tôi có, nó là ký tự tương ứng cuối cùng trong tập thứ hai, trong trường hợp này là M:

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

(Tôi có thể tưởng tượng rằng một phiên bản khác trcó thể sử dụng ký tự khớp đầu tiên trong tập 2, sẽ cung cấp mộtA .)

Để trả lời câu hỏi thứ hai của bạn , bạn cần thêm 13 dấu chấm trong tập đầu tiên để "sử dụng" các chữ cái viết hoa còn lại trong bộ 2:

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

sau đó bạn có thể lặp lại mô hình:

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

cung cấp cho chúng tôi:

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

Và như vậy:

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

Cá nhân, tôi nghĩ rằng cách đầu tiên để làm điều đó trong câu hỏi của bạn là đơn giản hơn!

Cách đầu tiên cũng không biến đổi bất kỳ ký tự nào khác trong đầu vào. Ví dụ: so sánh:

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

với

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

1

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 trmệ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 trlệ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ế, trsẽ 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 trlệ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..."

3
Tôi không chắc làm thế nào bạn kết luận rằng "các chấm được thay thế bằng một chuỗi các chữ cái bắt đầu từ một đến số chấm"; hoàn toàn không phải vậy Không có phép thuật liên quan; như Prvt_Yadv giải thích, có hai bộ và trlà ánh xạ từ bộ 1 để thiết lập 2, như mọi khi, nhưng trong trường hợp này bạn đã lập bản đồ các nhân vật .đến A, và cũng có thể B, và cũng ..., và cũng có thể M. Điều này không thành vấn đề vì đầu vào của bạn không chứa a ., nhưng nếu có thì nó sẽ biến thành M( trsử dụng đầu ra cuối cùng mà bạn chỉ định cho đầu vào đã cho)
Michael Mrozek

Cảm ơn bạn đã làm rõ. Tôi đã cập nhật câu trả lời để sửa lỗi của mình :)
Frederico Oliveira

1
Tôi ngưỡng mộ những nỗ lực (ban đầu) của bạn trong việc sử dụng khoa học để xác định hành vi của chương trình này, nhưng trong tương lai bạn nên đưa ra càng nhiều giả thuyết khác nhau càng tốt và thử nghiệm thiết kế để phân biệt giữa tất cả chúng. trước khi thử sử dụng chúng. Nếu không, bạn sẽ bị lẫn lộn và điều chỉnh mô hình của mình theo cách ít thay đổi nhất để giải thích các kết quả tiếp theo cho đến khi mô hình của bạn chỉ là một loạt các trường hợp đặc biệt.
wizzwizz4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.