วิธีใช้คำสั่ง tr ของ Linux

เผยแพร่แล้ว: 2023-05-17
หน้าจอเริ่มต้น Ubuntu Linux บนแล็ปท็อป
Jordan Gloor / How-To Geek
คำสั่ง tr ดำเนินการแปลงในสตรีมของข้อความ สร้างสตรีมใหม่เป็นเอาต์พุต คุณสามารถแทนที่ ลบ หรือแปลงอักขระตามกฎที่คุณตั้งไว้ในบรรทัดคำสั่ง

คุณต้องการวิธีการง่ายๆ ในการจัดการกระแสข้อความใน Linux หรือไม่? ไม่ต้องมองหาอะไรมากไปกว่าคำสั่ง tr ซึ่งสามารถช่วยคุณประหยัดเวลาในการแทนที่ ลบ รวม และบีบอัดข้อความอินพุต นี่คือวิธีการทำ

สารบัญ

คำสั่ง tr คืออะไร?
การเปลี่ยนตัวละคร
การใช้ช่วงและโทเค็น
สลับการแข่งขัน
การลบและการบีบอักขระ
การลบตัวละคร
การรวมและการแยกเส้น
การใช้ TR กับท่อ
ง่ายง่ายเหมือนทำ

คำสั่ง tr คืออะไร?

คำสั่ง tr ของ Linux เป็นโปรแกรมอรรถประโยชน์ที่ง่ายและรวดเร็วสำหรับการดึงอักขระที่ไม่ต้องการออกจากสตรีมข้อความ และสำหรับกลอุบายการจัดการที่เรียบร้อยอื่นๆ ได้ชื่อมาจากคำว่า "translate" และรากศัพท์ของ tr นั้นหยั่งรากลึกในประเพณีของ Unix

ดังที่เราทราบกันดีว่า Linux เป็นโอเพ่นซอร์สที่เขียนใหม่ของ Unix มันเพิ่มสิ่งต่าง ๆ ของตัวเองลงในส่วนผสมด้วย ไม่ใช่การโคลนแบบไบต์ต่อไบต์ แต่เห็นได้ชัดว่าใช้หลักการออกแบบและการควบคุมทางวิศวกรรมจากระบบปฏิบัติการ Unix

แม้ว่าจะมีเพียงลีนุกซ์ดิสทริบิวชันสองตัวเท่านั้นที่ได้รับการรับรองว่าเป็นไปตาม POSIX และประทับตรายางว่าได้รับการยอมรับอย่างเป็นทางการว่าเป็นการใช้งาน Unix—EulerOS และ Inspur K-UX—Linux ได้เข้ามาแทนที่ Unix ในโลกธุรกิจเกือบทั้งหมด

ลินุกซ์ดิสทริบิวชันทั้งหมด อย่างน้อยในยูทิลิตี้หลัก ปฏิบัติตามปรัชญาของยูนิกซ์ ปรัชญา Unix สรุปวิสัยทัศน์ของผู้บุกเบิก Unix สำหรับระบบปฏิบัติการใหม่ของพวกเขา มักมีคำเปรียบเปรยว่า "เขียนโปรแกรมที่ทำสิ่งหนึ่งได้ดี" แต่มีมากกว่านั้น

หนึ่งในนวัตกรรมที่ทรงพลังที่สุดคือโปรแกรมควรสร้างเอาต์พุตที่สามารถใช้เป็นอินพุตไปยังโปรแกรมอื่นได้ ความสามารถในการรวมยูทิลิตี้บรรทัดคำสั่งแบบเดซี่เชนเข้าด้วยกัน โดยใช้สตรีมเอาต์พุตจากโปรแกรมหนึ่งเป็นสตรีมอินพุตไปยังโปรแกรมถัดไปในบรรทัด มีประสิทธิภาพอย่างมาก

บางครั้งคุณอาจต้องการปรับแต่งหรือปรับแต่งเอาต์พุตจากโปรแกรมหนึ่งก่อนที่มันจะไปถึงโปรแกรมถัดไปในบรรทัด หรือบางทีคุณอาจไม่ได้ป้อนข้อมูลจากเครื่องมือบรรทัดคำสั่งของ Linux คุณกำลังสตรีมข้อความจากไฟล์ที่ไม่ได้สร้างขึ้นโดยคำนึงถึงความต้องการเฉพาะของคุณ

นี่คือที่มาของ tr อนุญาตให้คุณดำเนินการชุดของการแปลงอย่างง่ายบนสตรีมอินพุตเพื่อสร้างสตรีมเอาต์พุต สตรีมเอาต์พุตนั้นสามารถเปลี่ยนเส้นทางไปยังไฟล์ ฟีดไปยังโปรแกรม Linux อื่น หรือแม้แต่ไปยังอินสแตนซ์อื่นของ tr เพื่อให้มีการแปลงหลายรายการที่ใช้กับสตรีม

การเปลี่ยนตัวละคร

คำสั่ง tr ทำงานในสตรีมอินพุตตามกฎ ใช้โดยไม่มีตัวเลือกบรรทัดคำสั่ง การดำเนินการเริ่มต้นของ tr คือการแทนที่อักขระในสตรีมอินพุตสำหรับอักขระอื่น

คำสั่ง tr มักจะต้องใช้อักขระสองชุด ชุดแรกจะเก็บอักขระที่จะถูกแทนที่หากพบในสตรีมอินพุต ชุดที่สองมีอักขระที่จะถูกแทนที่ด้วย

วิธีการทำงานนี้คือการเกิดขึ้นของอักขระตัวแรกในชุดที่หนึ่งจะถูกแทนที่ด้วยอักขระตัวแรกในชุดที่สอง การเกิดขึ้นของอักขระตัวที่สองในชุดที่หนึ่งจะถูกแทนที่ด้วยอักขระตัวที่สองในชุดที่สอง เป็นต้น

ตัวอย่างนี้จะมองหาตัวอักษร "c" ในสตรีมอินพุตเป็น tr และแทนที่แต่ละรายการด้วยตัวอักษร "z" โปรดทราบว่า tr คำนึงถึงขนาดตัวพิมพ์

เรากำลังใช้ echo เพื่อดันข้อความเข้าไปใน tr

 ก้อง abcdefabc | tr 'c' 'z' 

การแทนที่อักขระตัวเดียวด้วย tr

รายการทั้งหมดของ "c" จะถูกแทนที่ด้วย "z" และสตริงใหม่จะถูกเขียนไปยังหน้าต่างเทอร์มินัล

คราวนี้เราจะค้นหาตัวอักษรสองตัวคือ “a” และ “c” โปรดทราบว่าเราไม่ได้ค้นหาคำว่า "ac" เรากำลังมองหา "a" แล้วมองหา "c" เราจะแทนที่ "a" ด้วย "x" และแทนที่ "c" ด้วย "z"

 ก้อง abcdefabc | tr 'แอค' 'xz' 

การลบตัวอักษรสองตัวด้วย tr

เพื่อให้ได้ผล คุณต้องมีจำนวนอักขระเท่ากันในทั้งสองชุด หากคุณไม่ทำเช่นนั้น คุณจะได้รับพฤติกรรมที่คาดเดาได้ แต่อาจเป็นพฤติกรรมที่ไม่พึงประสงค์

 เสียงสะท้อน 'เรียกฉันว่าอิชมาเอล' | tr 'abcdjklm' '123' 

การใช้ชุดอักขระที่ไม่สมดุลกับ tr

มีตัวละครในชุดที่หนึ่งมากกว่าชุดที่สอง ตัวอักษร "d" ถึง "m" ไม่มีอักขระที่สอดคล้องกันในชุดที่สอง พวกเขาจะยังคงถูกแทนที่ แต่พวกเขาทั้งหมดจะถูกแทนที่ด้วยอักขระตัวสุดท้ายในชุดที่สอง

เป็นไปได้ว่าสิ่งนี้อาจมีประโยชน์ในบางกรณี แต่ถ้าคุณต้องการป้องกันสิ่งนี้ คุณสามารถใช้ตัวเลือก -t (truncate) สิ่งนี้จะแทนที่อักขระที่มีอยู่ในชุดที่หนึ่งซึ่งมีอักขระที่ตรงกันในชุดที่สองเท่านั้น

 เสียงสะท้อน 'เรียกฉันว่าอิชมาเอล' | tr -t 'abcdjklm' '123' 

การใช้ชุดอักขระที่ไม่สมดุลกับ tr พร้อมตัวเลือกการตัดทอน

การใช้ช่วงและโทเค็น

ชุดที่หนึ่งและชุดที่สองสามารถมีช่วงของอักขระได้ ตัวอย่างเช่น [az] แทนตัวพิมพ์เล็กทั้งหมด และ [AZ] แทนตัวพิมพ์ใหญ่ทั้งหมด เราสามารถใช้สิ่งนี้เพื่อเปลี่ยนตัวพิมพ์ของข้อความ

สิ่งนี้จะแปลงอินพุตสตรีมเป็นตัวพิมพ์ใหญ่

 echo "How-To Geek" | tr '[แอซ]' '[AZ]' 

การใช้ช่วงอักขระเพื่อแปลงสตริงเป็นตัวพิมพ์ใหญ่

ในการพลิกตัวพิมพ์ไปในทิศทางอื่น เราสามารถใช้คำสั่งเดียวกัน แต่มีการสลับช่วงตัวพิมพ์ใหญ่และตัวพิมพ์เล็กในบรรทัดคำสั่ง

 echo "How-To Geek" | tr '[AZ]' '[อัซ]' 

การใช้ช่วงอักขระเพื่อแปลงสตริงเป็นตัวพิมพ์เล็ก

มีโทเค็นที่เราสามารถใช้กับกรณีทั่วไปบางกรณีที่เราอาจต้องการจับคู่ด้วย

  • [:alnum:] : ตัวอักษรและตัวเลข
  • [:alpha:] : ตัวอักษรเท่านั้น
  • [:digit:] : ตัวเลขเท่านั้น
  • [:blank:] : แท็บและช่องว่าง
  • [:space:] : ช่องว่างทั้งหมด รวมถึงอักขระขึ้นบรรทัดใหม่
  • [:กราฟ:] : อักขระทั้งหมดรวมถึงสัญลักษณ์ แต่ไม่ใช่ช่องว่าง
  • [:print:] : อักขระทั้งหมดรวมถึงสัญลักษณ์ รวมถึงช่องว่าง
  • [:punct:] : เครื่องหมายวรรคตอนทั้งหมด
  • [:lower:] : ตัวอักษรพิมพ์เล็ก
  • [:upper:] : ตัวอักษรพิมพ์ใหญ่

เราสามารถดำเนินการแปลงตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่และตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็กได้อย่างง่ายดายโดยใช้โทเค็น

 echo "How-To Geek" | tr '[:ล่าง:]' '[:บน:]'
 echo "How-To Geek" | tr '[:บน:]' '[:ล่าง:]' 

การใช้โทเค็นเพื่อเปลี่ยนตัวพิมพ์ของสตริงข้อความ

สลับการแข่งขัน

ตัวเลือก -c (ส่วนเสริม) จะจับคู่อักขระทั้งหมดยกเว้นอักขระในชุดแรก คำสั่งนี้แปลงทุกอย่างยกเว้นตัวอักษร “c” เป็นยัติภังค์ ” -

 ก้อง abcdefc | tr -c 'ค' '-' 

แทนที่อักขระทั้งหมดยกเว้นอักขระที่ระบุด้วยอักขระอื่น

คำสั่งนี้เพิ่มตัวอักษร “a” ในชุดแรก สิ่งที่นอกเหนือจาก "a" หรือ "c" จะถูกแปลงเป็นอักขระยัติภังค์ " - "

 ก้อง abcdefc | tr -c 'ac' '-' 

การแทนที่อักขระทั้งหมดยกเว้นอักขระหลายตัวที่ระบุด้วยอักขระอื่น

การลบและการบีบอักขระ

เราสามารถใช้ tr เพื่อลบอักขระทั้งหมดโดยไม่ต้องแทนที่ใดๆ

คำสั่งนี้ใช้ตัวเลือก -d (ลบ) เพื่อลบ "a", "d" หรือ "f" ที่เกิดขึ้นจากอินพุตสตรีม

 ก้อง abcdefc | tr -d 'แอด' 

การลบอักขระหลายตัวออกจากสตริงข้อความด้วย tr

นี่เป็นตัวอย่างหนึ่งที่เรามีชุดอักขระเพียงชุดเดียวในบรรทัดคำสั่ง ไม่ใช่สองชุด

อีกประการหนึ่งคือเมื่อเราใช้ตัวเลือก -s (squeeze-repeats) ตัวเลือกนี้จะลดอักขระซ้ำให้เหลือเพียงอักขระเดียว

ตัวอย่างนี้จะลดลำดับซ้ำๆ ของอักขระช่องว่างเป็นช่องว่างเดียว

 echo "abc de fc" | tr -s '[: ว่าง:]' 

การเปลี่ยนลำดับของอักขระซ้ำๆ เป็นอักขระที่เกิดขึ้นครั้งเดียว ด้วย tr

สับสนเล็กน้อยว่าโทเค็น [:blank:] แทนอักขระช่องว่าง และโทเค็น [:space:] แทนช่องว่างทุกรูปแบบ รวมถึงแท็บและอักขระขึ้นบรรทัดใหม่

ในกรณีนี้ เราสามารถแทนที่ [:blank:] ด้วย [:space:] และได้ผลลัพธ์เดียวกัน

 echo "abc de fc" | tr -s '[: ช่องว่าง:]' 

การเปลี่ยนลำดับของอักขระซ้ำๆ เป็นอักขระที่เกิดขึ้นครั้งเดียว ด้วย tr

การลบตัวละคร

ความแตกต่างระหว่าง [:blank:] และ [:space:] จะปรากฏชัดเจนเมื่อเราลบอักขระ ในการทำเช่นนี้ เราใช้ตัวเลือก -d (ลบ) และให้ชุดอักขระที่ tr จะค้นหาในสตรีมอินพุต สิ่งที่พบจะถูกลบออก

 echo "abc de fc" | tr -d '[: ว่าง:]' 

การลบช่องว่าง (อักขระเว้นวรรค) ออกจากสตริงข้อความด้วย tr

ช่องว่างจะถูกลบ โปรดทราบว่าเราได้รับการขึ้นบรรทัดใหม่หลังจากเขียนสตรีมเอาต์พุตในหน้าต่างเทอร์มินัล ถ้าเราทำซ้ำคำสั่งนั้นและใช้ [:space:] แทนช่องว่าง เราจะได้ผลลัพธ์ที่ต่างออกไป

 echo "abc de fc" | tr -d '[: ว่าง:]' 

การลบช่องว่างออกจากสตริงข้อความด้วย tr

คราวนี้เราจะไม่เริ่มบรรทัดใหม่หลังจากเอาต์พุต นี่เป็นเพราะ [:space:] มีการขึ้นบรรทัดใหม่ ช่องว่าง แท็บ และอักขระขึ้นบรรทัดใหม่จะถูกลบออกจากสตรีมอินพุต

แน่นอน คุณสามารถใช้อักขระเว้นวรรคจริงได้เช่นกัน

 echo "abc de fc" | tr -d ' ' 

การลบช่องว่างออกจากสตริงข้อความโดยระบุอักขระเว้นวรรคด้วย tr

เราสามารถลบตัวเลขได้อย่างง่ายดาย

 เสียงสะท้อน abcd123efg | tr -d '[:หลัก:]' 

การลบตัวเลขออกจากสตริงข้อความด้วย tr

ด้วยการรวมตัวเลือก -c (ส่วนเสริม) และ -d (ลบ) เราสามารถลบทุกอย่างยกเว้นตัวเลขได้

 เสียงสะท้อน abcd123efg | tr -cd '[:หลัก:]' 

ลบทุกอย่างยกเว้นตัวเลขจากสตริงข้อความโดยใช้ tr

โปรดทราบว่าทุกสิ่งที่นอกเหนือจากตัวเลขหมายถึงตัวอักษรทั้งหมด และ ช่องว่างทั้งหมด ดังนั้นเราจะสูญเสียการขึ้นบรรทัดใหม่อีกครั้ง

การรวมและการแยกเส้น

หากเราแทนที่อักขระขึ้นบรรทัดใหม่เพื่อเว้นวรรค เราสามารถแบ่งบรรทัดข้อความและวางแต่ละคำในบรรทัดของตัวเองได้

 echo 'หนึ่งสองสามสี่' | ทร' ''\n' 

การแบ่งบรรทัดข้อความเป็นหนึ่งคำต่อบรรทัดด้วย tr

เราสามารถเปลี่ยนตัวคั่นที่แยกคำได้เช่นกัน คำสั่งนี้แทนที่เครื่องหมายทวิภาค ” : ” สำหรับช่องว่าง

 echo 'หนึ่งสองสามสี่' | ทร' '':' 

การเปลี่ยนตัวคั่นคำจากช่องว่างเป็นทวิภาคด้วย tr

เราสามารถค้นหาตัวคั่นใดๆ ที่ใช้อยู่ และแทนที่ด้วยอักขระขึ้นบรรทัดใหม่ แยกข้อความที่อ่านยากออกเป็นเอาต์พุตที่จัดการได้ง่ายขึ้น

ตัวแปรสภาพแวดล้อมเส้นทางเป็นสตริงยาวของเส้นทางไดเร็กทอรีจำนวนมาก เครื่องหมายทวิภาค ” : ” คั่นแต่ละเส้นทาง เราจะเปลี่ยนเป็นอักขระขึ้นบรรทัดใหม่

 สะท้อน $PATH
 สะท้อน $PATH | tr ":" "\n" 

แยกตัวแปรสภาพแวดล้อม $PATH ออกเป็นพาธไดเร็กทอรีแยกกัน หนึ่งรายการต่อบรรทัด ด้วย tr

ง่ายกว่ามากในการแยกวิเคราะห์ด้วยสายตา

หากเรามีเอาต์พุตที่ต้องการฟอร์แมตใหม่เป็นบรรทัดเดียว เราก็สามารถทำได้เช่นกัน ไฟล์ “lines.txt” มีข้อความบางส่วน โดยมีหนึ่งคำในแต่ละบรรทัด เราจะป้อนมันเป็น tr และแปลงเป็นบรรทัดเดียว

 ไฟล์ cat.txt
 cat lines.txt | ตร '\n' ' ' 

รวมอินพุตหลายบรรทัดเป็นข้อความบรรทัดเดียวโดยใช้ tr

การใช้ TR กับท่อ

เราสามารถใช้เอาต์พุตจาก tr เป็นอินพุตสำหรับโปรแกรมอื่น หรือแม้แต่กับ tr เอง

คำสั่งนี้ใช้ tr สี่ครั้ง

  • tr ตัวแรกจะลบยัติภังค์ "-" ออกจากอินพุต
  • tr ที่สองบีบช่องว่างที่ซ้ำกันให้เป็นช่องว่างเดียว
  • tr ตัวที่สามแทนที่ช่องว่างด้วยเครื่องหมายขีดล่าง “_”
  • tr ที่สี่และสุดท้ายแปลงสตริงเป็นตัวพิมพ์เล็ก
 echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr' ' _' | tr '[:บน:]' '[:ล่าง:]' 

ไปป์ไลน์ของสี่อินสแตนซ์ของ tr

ที่เกี่ยวข้อง: วิธีใช้ไพพ์บน Linux

ง่ายง่ายเหมือนทำ

คำสั่ง tr นั้นยอดเยี่ยมเพราะมันง่าย ไม่มีอะไรให้เรียนรู้หรือจดจำมากนัก แต่ความเรียบง่ายก็สามารถเป็นความหายนะได้เช่นกัน

อย่าพลาด บ่อยครั้งที่คุณจะพบว่า tr ช่วยให้คุณทำสิ่งที่คุณต้องการได้โดยไม่ต้องใช้เครื่องมือที่ซับซ้อนเช่น sed

วิธีใช้คำสั่ง sed บน Linux
ที่เกี่ยวข้อง วิธีใช้คำสั่ง sed บน Linux

อย่างไรก็ตาม หากคุณประสบปัญหาในการทำบางอย่างกับ tr และคุณพบว่าตัวเองกำลังสร้างชุดคำสั่งแบบเดซี่เชนยาวๆ คุณน่าจะใช้ sed