โอเคขอบคุณ @Prvt_Yadv ฉันเข้าใจจุดต่าง ๆ ได้ นี่คือคำตอบของคำถามแรก:
เวทมนตร์ที่อยู่เบื้องหลังtr
คำสั่งที่สองคืออะไร
จุด 13 จุดจะถูกแมปกับตัวอักษร 13 ตัวแรกจากชุดที่สองอย่างง่ายดาย ดังนั้น
tr .............A-Z A-ZA-Z
จะผลิตชุดต่อไปนี้:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
หากอินพุตของคุณไม่มีจุดคุณสามารถละทิ้งลำดับเริ่มต้นเนื่องจากคุณจะไม่ใช้การแทนที่เหล่านั้น จากนั้นฉากจะกลายเป็น:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
แต่เนื่องจากชุดแรกประกอบด้วยตัวอักษรทั้งหมด 26 ตัวและชุดที่ 2 ได้ทำตามตัวอักษรที่ซ้ำกัน
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
ซึ่งการทดแทน rot13 และเหมือนกันกับคำสั่งแรก (ยกเว้นสำหรับการไม่จัดการกับตัวพิมพ์เล็กที่นี่) ตรรกะเดียวกันสามารถนำไปใช้กับชื่อของคำถาม:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
จะผลิตชุด:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
ยกเลิกลำดับเริ่มต้นและต่อท้ายตัวอักษรซ้ำพวกเขากลายเป็น:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
ซึ่งเป็นการทดแทน rot3
ตอนนี้สำหรับคำถามที่สอง:
วิธีทำให้คำสั่งที่สองทำงานได้ทั้งตัวเล็กและตัวใหญ่เช่นเดียวกับคำสั่งแรก?
ในการทำให้มันทำงานคุณต้องใส่จำนวนจุดที่ต้องการที่จุดเริ่มต้นจับคู่เน่าของคุณและ 26 จุดระหว่างลำดับบนและลำดับล่างเช่นนี้:
tr ........A-Z..........................a-z A-ZA-Za-za-z
สิ่งนี้จะสร้าง rot8 ที่ไม่รู้สึกได้สำเร็จ เพื่อให้เห็นภาพว่าทำไมสิ่งนี้ถึงได้ผลลองดูเซต:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
ไม่รวมการแมปจุดและตัวอักษรต่อท้าย:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
ตอนนี้มันใช้ได้กับทั้งตัวใหญ่และตัวเล็ก :)
อีกวิธีในการทำให้ใช้งานได้คือใช้สองtr
คำสั่งดังนี้:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
คำเตือนในการใช้การแทนที่จุดถูกให้โดย @iruvar: คำสั่งนี้จะไม่ทำงานอย่างที่คาดไว้เมื่อสตริงอินพุตมีจุด นี่เป็นเพราะจุดที่ถูกแมปกับตัวอักษรอื่น ๆ และเมื่อทำการทดแทนtr
จะเปลี่ยนจุดป้อนข้อมูลเป็นตัวอักษรที่แมปล่าสุด แต่คุณสามารถใช้อักขระอื่นนอกเหนือจากจุดได้ ดังนั้นหากใช้จุดในtr
คำสั่งของคุณเป็นปัญหาคุณสามารถใช้@
แทนได้ สิ่งนี้จะใช้ได้ดีเหมือนกัน:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."