Tôi tìm thấy một địa chỉ email bị xáo trộn có thể được giải mã bằng lệnh này:
echo "cbyrzba@cbyrzba.bet" | tr '[a-z]' '[n-za-m]'
Làm thế nào mà đầu ra một địa chỉ e-mail hợp lệ? Lệnh đó đang làm gì?
Tôi tìm thấy một địa chỉ email bị xáo trộn có thể được giải mã bằng lệnh này:
echo "cbyrzba@cbyrzba.bet" | tr '[a-z]' '[n-za-m]'
Làm thế nào mà đầu ra một địa chỉ e-mail hợp lệ? Lệnh đó đang làm gì?
Câu trả lời:
tr
Trang người đàn ông giải thích nó khá tốt; đó là bộ lọc chuyển đổi các ký tự từ bộ này sang bộ khác. Bộ đầu tiên được chỉ định là [a-z]
, đó là một cách viết nhanh [abcdefghijklmnopqrstuvwxyz]
. Thứ hai là [n-za-m]
, mà biến thành [nopqrstuvwxyzabcdefghijklm]
. tr
đọc từng ký tự từ stdin và nếu nó xuất hiện trong tập đầu tiên, nó sẽ thay thế nó bằng ký tự ở cùng vị trí trong tập thứ hai (điều này có nghĩa [
và ]
đang được thay thế bằng chính chúng, vì vậy bao gồm chúng là vô nghĩa, nhưng rất nhiều người làm điều đó do nhầm lẫn bởi vì các biểu thức thông thường sử dụng chúng để thể hiện các lớp ký tự để họ nghĩ rằng tr
cần có chúng).
Vì vậy, một ví dụ đơn giản hơn:
$ echo abc | tr ab xy
xyc
a
biến thành x
, b
biến thành y
và c
không thay đổi vì nó không ở tập đầu tiên. Tất cả người dùng đã làm trong trường hợp này là chạy địa chỉ e-mail của họ thông qua cùng một bộ lọc (vì nó đối xứng - a
ánh xạ tới n
và n
quay lại a
, v.v.) để có được phiên bản xoay; bạn chạy nó qua một lần nữa hoán đổi tất cả các ký tự trở lại bản gốc của chúng
Sidenote: Sự hoán đổi cụ thể này, trong đó mỗi chữ cái được thay thế bằng một ký tự cách xa 13 ký tự trong bảng chữ cái, được gọi là ROT13 (xoay 13); nó được phổ biến trên các nhóm tin như một cách để che giấu những thứ mà mọi người có thể không muốn thấy
[
và ]
hữu ích: Chúng đôi khi là bắt buộc (ví dụ một số tr mặc định của solaris cần chúng). Do đó, đây có lẽ là một thói quen tốt (một khi người ta biết không trộn lẫn những thứ đó với chế độ regrec '[...]')
tr
chuyển ngữ các ký tự: đối với một số ký tự x trong đầu vào, nó xuất ra một ký tự y.
tr
nhận hai đối số dòng lệnh, ký tự "từ" và ký tự "đến".
Trong ví dụ của bạn ở trên, "từ các ký tự" được đưa ra là '[a-z]'
. "Đến nhân vật" được đưa ra là '[n-za-m]'
. Các dấu ngoặc đơn giữ cho lớp vỏ diễn giải dòng lệnh không làm gì với hai đối số. tr
coi các đối số ngoặc vuông là phạm vi. Vì vậy, '[a-z]' means "all lower case characters from 'a' to 'z', inclusive". The second argument is a bit more complicated,
'[n-za-m]' `có nghĩa là" các ký tự chữ thường từ 'n' đến 'z', và các ký tự chữ thường từ 'a' đến 'm', bao gồm '.
tr
chuyển đổi tất cả các ký tự 'a' thành 'n', 'b' thành 'm', 'c' thành 'o', v.v., cho đến đầu ra 'n' ký tự là 'z'. Các ký tự 'o' trong đầu vào nhận đầu ra là 'a', 'p' đến 'b', 'q' đến 'c', v.v. Các ký tự 'z' trong đầu vào có đầu ra là 'l'.
Về cơ bản, lệnh của bạn thực hiện Mật mã Caesar trên đầu vào của nó, một ký tự chữ thường tại một thời điểm. Ai đó đã phải mã hóa "polemon@polemon.org" để lấy chuỗi bạn đã echo
xuất.
So '[a-z]' means "all lower case characters from 'a' to 'z', inclusive"
không, nó có nghĩa là: '[' và tất cả các chữ cái 'a' đến 'z' (trong ngôn ngữ của bạn!) và ']'. Rất may, đối số thứ 2 thay thế "[" bằng "[" và "]" bằng "]". Thông báo trước khác: ở một số địa phương, az có thể là: tất cả các chữ cái viết thường ascii hoặc tất cả các chữ cái (chữ thường VÀ chữ thường) ngoại trừ "A" (hoặc ngoại trừ "Z" ở các địa phương khác) hoặc đôi khi là "tất cả các chữ cái từ a đến z , bao gồm cả các chữ cái có dấu ". Để đảm bảo thông thường: buộc miền địa phương trong khi gọi tr: LC_ALL='C' tr 'a-z' 'A-Z'
(hoặc LC_ALL='C' tr '[a-z]' '[A-Z]'
)
tr '[a-z]' '[n-za-m]'
thành:LC_ALL='C' tr '[a-z]' '[n-za-m]'