จุดในคำสั่ง tr นี้ทำอะไร: tr ... AZ A-ZA-Z <<<“ JVPQBOV” (มี 13 จุด)


18

ฉันต้องการใช้trเพื่อทำการแปลง rot13 ฉันสามารถเข้าใจคำสั่งนี้ได้อย่างสวยงาม:

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

เอาท์พุตใดHELP ME PLEASEแต่ฉันไม่สามารถเข้าใจได้ว่าคำสั่งอื่นสามารถสร้างการเปลี่ยนแปลง rot13 เดียวกันได้อย่างไร:

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

ดังนั้นฉันมีสองคำถาม:

  1. เวทมนตร์ที่อยู่เบื้องหลังtrคำสั่งที่สองคืออะไร
  2. วิธีทำให้คำสั่งที่สองทำงานได้ทั้งตัวเล็กและตัวใหญ่เช่นเดียวกับคำสั่งแรก?

ฉันรู้ว่ามี 13 จุด สิ่งที่ฉันอยากรู้ก็คือมันทำงานอย่างไร ไม่มีคำอธิบายเกี่ยวกับจุดต่างๆในคู่มือ
Frederico Oliveira

4
คุณมีความหวังดีกว่าที่คุณจะไม่พบจุดในข้อความป้อนเข้าของคุณ
iruvar

1
FWIW แบบฟอร์มที่สั้นกว่าtr [.*13].A-Z A-ZA-Zใช้ได้เช่นเดียวกับtr .............A-Z A-ZA-Z
iruvar

คำตอบ:


17

มันทำงานได้ดังต่อไปนี้:

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

ดังนั้นtrจะแปลไปSET1SET2

นี่เทียบเท่ากับอันแรกเพราะมันเปลี่ยน13หน่วยไปตามจุด 13 จุด

หากต้องการรวมตัวอักษรตัวพิมพ์เล็กคุณจะต้องจัดเรียงตัวอักษรเหล่านั้นSET1ด้วยออฟเซ็ตที่คล้ายกันเช่น:

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

ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm

นั่นคือ 26 จุดระหว่างZและaโดยแบ่งครึ่งตัวพิมพ์ใหญ่และครึ่งตัวอักษรพิมพ์เล็ก ดังนั้นtrคำสั่งจะเป็น:

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

14

ในฐานะที่เป็น @Prvt_Yadv พูดในคำตอบของพวกเขามันทำงานได้เพราะมี 13 จุด

ในเซตนั้น

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

จุดไม่ใช่ตัวอักษรพิเศษดังนั้นหากคุณมีจุดในการป้อนข้อมูลของคุณก็จะถูกแปลเช่นกัน ในเวอร์ชั่นtrที่ฉันมีมันเป็นตัวละครสุดท้ายที่เกี่ยวข้องในเซตที่สองในกรณีนี้คือM:

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

(ฉันนึกภาพออกว่ารุ่นที่แตกต่างกันtrอาจใช้อักขระตัวแรกในชุดที่ 2 ซึ่งจะให้A)

ในการตอบคำถามที่สองของคุณคุณต้องมีจุดอีก 13 จุดในชุดแรกเพื่อ "ใช้" ตัวอักษรตัวพิมพ์ใหญ่ที่เหลือในชุดที่ 2:

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

จากนั้นคุณสามารถทำซ้ำรูปแบบ:

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

ซึ่งทำให้เรา:

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

และอื่น ๆ :

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

โดยส่วนตัวแล้วฉันคิดว่าวิธีแรกในการทำคำถามของคุณนั้นง่ายกว่า!

วิธีแรกยังไม่ได้แปลงอักขระอื่น ๆ ในอินพุต ตัวอย่างเช่นเปรียบเทียบ:

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

กับ

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

1

โอเคขอบคุณ @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..."

3
ฉันไม่แน่ใจว่าคุณสรุปได้อย่างไรว่า "จุดถูกแทนที่ด้วยลำดับตัวอักษรที่เริ่มจาก a ถึงจำนวนจุด"; นั่นไม่ใช่ทั้งหมด ไม่มีเวทมนต์เกี่ยวข้อง ดังที่ Prvt_Yadv อธิบายมีอยู่สองชุดและtrการแมปจากชุดที่ 1 ถึงชุดที่ 2 เช่นเคย แต่ในกรณีนี้คุณได้แมปตัวละคร.กับAและยังBและ ... และMด้วย ไม่สำคัญเนื่องจากอินพุตของคุณไม่มี a .แต่ถ้าเป็นเช่นนั้นก็จะเปลี่ยนเป็นM( trใช้เอาต์พุตสุดท้ายที่คุณระบุสำหรับอินพุตที่กำหนด)
Michael Mrozek

ขอขอบคุณสำหรับการชี้แจง. ผมได้ปรับปรุงคำตอบในการแก้ไขข้อผิดพลาดของฉัน :)
Frederico Oliveira

1
ฉันชื่นชมของคุณ (เริ่มต้น) พยายามที่จะใช้วิทยาศาสตร์เพื่อกำหนดพฤติกรรมของโปรแกรมนี้ แต่ในอนาคตคุณควรตั้งสมมติฐานที่แตกต่างกันให้ได้มากที่สุดและออกแบบการทดสอบเพื่อแยกแยะระหว่างพวกเขาทั้งหมดก่อนที่จะพยายามใช้ มิฉะนั้นคุณจะสับสนและปรับโมเดลของคุณในลักษณะที่เปลี่ยนแปลงน้อยที่สุดเพื่ออธิบายผลลัพธ์ที่ตามมาจนกระทั่งโมเดลของคุณเป็นกรณีพิเศษจำนวนมาก
wizzwizz4
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.