วิธีใช้คำสั่ง tr ของ Linux
เผยแพร่แล้ว: 2023-05-17คุณต้องการวิธีการง่ายๆ ในการจัดการกระแสข้อความใน 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'
รายการทั้งหมดของ "c" จะถูกแทนที่ด้วย "z" และสตริงใหม่จะถูกเขียนไปยังหน้าต่างเทอร์มินัล
คราวนี้เราจะค้นหาตัวอักษรสองตัวคือ “a” และ “c” โปรดทราบว่าเราไม่ได้ค้นหาคำว่า "ac" เรากำลังมองหา "a" แล้วมองหา "c" เราจะแทนที่ "a" ด้วย "x" และแทนที่ "c" ด้วย "z"
ก้อง abcdefabc | tr 'แอค' 'xz'
เพื่อให้ได้ผล คุณต้องมีจำนวนอักขระเท่ากันในทั้งสองชุด หากคุณไม่ทำเช่นนั้น คุณจะได้รับพฤติกรรมที่คาดเดาได้ แต่อาจเป็นพฤติกรรมที่ไม่พึงประสงค์
เสียงสะท้อน 'เรียกฉันว่าอิชมาเอล' | tr 'abcdjklm' '123'
มีตัวละครในชุดที่หนึ่งมากกว่าชุดที่สอง ตัวอักษร "d" ถึง "m" ไม่มีอักขระที่สอดคล้องกันในชุดที่สอง พวกเขาจะยังคงถูกแทนที่ แต่พวกเขาทั้งหมดจะถูกแทนที่ด้วยอักขระตัวสุดท้ายในชุดที่สอง
เป็นไปได้ว่าสิ่งนี้อาจมีประโยชน์ในบางกรณี แต่ถ้าคุณต้องการป้องกันสิ่งนี้ คุณสามารถใช้ตัวเลือก -t
(truncate) สิ่งนี้จะแทนที่อักขระที่มีอยู่ในชุดที่หนึ่งซึ่งมีอักขระที่ตรงกันในชุดที่สองเท่านั้น
เสียงสะท้อน 'เรียกฉันว่าอิชมาเอล' | tr -t 'abcdjklm' '123'
การใช้ช่วงและโทเค็น
ชุดที่หนึ่งและชุดที่สองสามารถมีช่วงของอักขระได้ ตัวอย่างเช่น [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 'แอด'
นี่เป็นตัวอย่างหนึ่งที่เรามีชุดอักขระเพียงชุดเดียวในบรรทัดคำสั่ง ไม่ใช่สองชุด
อีกประการหนึ่งคือเมื่อเราใช้ตัวเลือก -s
(squeeze-repeats) ตัวเลือกนี้จะลดอักขระซ้ำให้เหลือเพียงอักขระเดียว
ตัวอย่างนี้จะลดลำดับซ้ำๆ ของอักขระช่องว่างเป็นช่องว่างเดียว
echo "abc de fc" | tr -s '[: ว่าง:]'
สับสนเล็กน้อยว่าโทเค็น [:blank:]
แทนอักขระช่องว่าง และโทเค็น [:space:]
แทนช่องว่างทุกรูปแบบ รวมถึงแท็บและอักขระขึ้นบรรทัดใหม่
ในกรณีนี้ เราสามารถแทนที่ [:blank:]
ด้วย [:space:]
และได้ผลลัพธ์เดียวกัน
echo "abc de fc" | tr -s '[: ช่องว่าง:]'
การลบตัวละคร
ความแตกต่างระหว่าง [:blank:]
และ [:space:]
จะปรากฏชัดเจนเมื่อเราลบอักขระ ในการทำเช่นนี้ เราใช้ตัวเลือก -d
(ลบ) และให้ชุดอักขระที่ tr
จะค้นหาในสตรีมอินพุต สิ่งที่พบจะถูกลบออก
echo "abc de fc" | tr -d '[: ว่าง:]'
ช่องว่างจะถูกลบ โปรดทราบว่าเราได้รับการขึ้นบรรทัดใหม่หลังจากเขียนสตรีมเอาต์พุตในหน้าต่างเทอร์มินัล ถ้าเราทำซ้ำคำสั่งนั้นและใช้ [:space:]
แทนช่องว่าง เราจะได้ผลลัพธ์ที่ต่างออกไป
echo "abc de fc" | tr -d '[: ว่าง:]'
คราวนี้เราจะไม่เริ่มบรรทัดใหม่หลังจากเอาต์พุต นี่เป็นเพราะ [:space:]
มีการขึ้นบรรทัดใหม่ ช่องว่าง แท็บ และอักขระขึ้นบรรทัดใหม่จะถูกลบออกจากสตรีมอินพุต
แน่นอน คุณสามารถใช้อักขระเว้นวรรคจริงได้เช่นกัน
echo "abc de fc" | tr -d ' '
เราสามารถลบตัวเลขได้อย่างง่ายดาย
เสียงสะท้อน abcd123efg | tr -d '[:หลัก:]'
ด้วยการรวมตัวเลือก -c
(ส่วนเสริม) และ -d
(ลบ) เราสามารถลบทุกอย่างยกเว้นตัวเลขได้
เสียงสะท้อน abcd123efg | tr -cd '[:หลัก:]'
โปรดทราบว่าทุกสิ่งที่นอกเหนือจากตัวเลขหมายถึงตัวอักษรทั้งหมด และ ช่องว่างทั้งหมด ดังนั้นเราจะสูญเสียการขึ้นบรรทัดใหม่อีกครั้ง
การรวมและการแยกเส้น
หากเราแทนที่อักขระขึ้นบรรทัดใหม่เพื่อเว้นวรรค เราสามารถแบ่งบรรทัดข้อความและวางแต่ละคำในบรรทัดของตัวเองได้
echo 'หนึ่งสองสามสี่' | ทร' ''\n'
เราสามารถเปลี่ยนตัวคั่นที่แยกคำได้เช่นกัน คำสั่งนี้แทนที่เครื่องหมายทวิภาค ” :
” สำหรับช่องว่าง
echo 'หนึ่งสองสามสี่' | ทร' '':'
เราสามารถค้นหาตัวคั่นใดๆ ที่ใช้อยู่ และแทนที่ด้วยอักขระขึ้นบรรทัดใหม่ แยกข้อความที่อ่านยากออกเป็นเอาต์พุตที่จัดการได้ง่ายขึ้น
ตัวแปรสภาพแวดล้อมเส้นทางเป็นสตริงยาวของเส้นทางไดเร็กทอรีจำนวนมาก เครื่องหมายทวิภาค ” :
” คั่นแต่ละเส้นทาง เราจะเปลี่ยนเป็นอักขระขึ้นบรรทัดใหม่
สะท้อน $PATH
สะท้อน $PATH | tr ":" "\n"
ง่ายกว่ามากในการแยกวิเคราะห์ด้วยสายตา
หากเรามีเอาต์พุตที่ต้องการฟอร์แมตใหม่เป็นบรรทัดเดียว เราก็สามารถทำได้เช่นกัน ไฟล์ “lines.txt” มีข้อความบางส่วน โดยมีหนึ่งคำในแต่ละบรรทัด เราจะป้อนมันเป็น tr
และแปลงเป็นบรรทัดเดียว
ไฟล์ cat.txt
cat lines.txt | ตร '\n' ' '
การใช้ TR กับท่อ
เราสามารถใช้เอาต์พุตจาก tr
เป็นอินพุตสำหรับโปรแกรมอื่น หรือแม้แต่กับ tr
เอง
คำสั่งนี้ใช้ tr
สี่ครั้ง
-
tr
ตัวแรกจะลบยัติภังค์ "-" ออกจากอินพุต -
tr
ที่สองบีบช่องว่างที่ซ้ำกันให้เป็นช่องว่างเดียว -
tr
ตัวที่สามแทนที่ช่องว่างด้วยเครื่องหมายขีดล่าง “_” -
tr
ที่สี่และสุดท้ายแปลงสตริงเป็นตัวพิมพ์เล็ก
echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr' ' _' | tr '[:บน:]' '[:ล่าง:]'
ที่เกี่ยวข้อง: วิธีใช้ไพพ์บน Linux
ง่ายง่ายเหมือนทำ
คำสั่ง tr
นั้นยอดเยี่ยมเพราะมันง่าย ไม่มีอะไรให้เรียนรู้หรือจดจำมากนัก แต่ความเรียบง่ายก็สามารถเป็นความหายนะได้เช่นกัน
อย่าพลาด บ่อยครั้งที่คุณจะพบว่า tr
ช่วยให้คุณทำสิ่งที่คุณต้องการได้โดยไม่ต้องใช้เครื่องมือที่ซับซ้อนเช่น sed
อย่างไรก็ตาม หากคุณประสบปัญหาในการทำบางอย่างกับ tr
และคุณพบว่าตัวเองกำลังสร้างชุดคำสั่งแบบเดซี่เชนยาวๆ คุณน่าจะใช้ sed