ในระบบ Linux และ Unix tr เป็นยูทิลิตี้บรรทัดคำสั่งที่แปลง ลบ และ "บีบอัด" ตัวอักษรที่ซ้ำกัน – จริงๆ แล้ว tr ย่อมาจาก "translate" คู่มือนี้อธิบายวิธีใช้คำสั่ง tr ใน Linux พร้อมตัวอย่าง มันสามารถใช้สำหรับการดำเนินการเช่น การลบตัวอักษรซ้ำ การแปลงตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ และการแทนที่และลบตัวอักษรพื้นฐาน มันมักใช้ร่วมกับคำสั่งอื่นๆ ผ่าน piping
Linux เป็นเคอร์เนล/แกนระบบปฏิบัติการพื้นฐานด้านหลังเทคโนโลยีส่วนใหญ่ที่เราใช้ในชีวิตประจำวัน รวมถึง Android – แพลตฟอร์มที่หลายคนในเราจะมีบนโทรศัพท์มือถือ มันเป็น open-source และกำหนดค่าได้ง่าย
วิธีใช้คำสั่ง tr
ไวยากรณ์สำหรับการรันคำสั่ง tr มีดังนี้ โดยตัวอักษรใน SET1 จะถูกแปลงเป็นตัวอักษรใน SET2:
tr OPTION... SET1 [SET2]
คำสั่ง tr ยอมรับสองชุดของตัวอักษร (โดยปกติความยาวเท่ากัน) มันจะแทนที่ตัวอักษรจากชุดแรกด้วยตัวอักษรที่สอดคล้องจากชุดที่สอง ในสถานการณ์นี้ SET คือสตริงของตัวอักษรและรวมถึงตัวอักษรพิเศษที่หนีบด้วย backslash
ตัวอย่าง
การใช้ช่วงตัวอักษร
คุณสามารถใช้ช่วงแทนคลาสตัวอักษรได้หากต้องการ:
echo 'hello' | tr 'a-z' 'A-Z'
เพื่อแปลงอีกทางหนึ่ง เพียงสลับตำแหน่งของชุด
แปลงเคส
การแปลงตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก หรือในทางกลับกัน เป็นหนึ่งในกรณีการใช้งานที่พบบ่อยที่สุดของคำสั่ง tr
[:lower:] ตรงกับตัวอักษรพิมพ์เล็กทั้งหมด และ [:upper:] ตรงกับตัวอักษรพิมพ์ใหญ่ทั้งหมด
echo 'Hello' | tr '[:lower:]' '[:upper:]' HELLO
ลบบรรทัดว่าง
เพื่อลบบรรทัดว่าง คุณต้อง "บีบอัด" ตัวอักษร newline ที่ซ้ำกัน:
tr -s '\n' < input.txt > output.txt
ในข้างต้น เราใช้สัญลักษณ์การเปลี่ยนทิศทาง ซึ่งจะเขียนเอาต์พุทของคำสั่งไปยัง output.txt
ลบตัวอักษรที่ไม่ใช่ตัวเลขทั้งหมด
คำสั่งต่อไปนี้ลบตัวอักษรที่ไม่ใช่ตัวเลขทั้งหมด:
echo "The account number is 10879358" | tr -cd [:digit:]
[:digit:] ย่อมาจากตัวอักษรตัวเลขทั้งหมด ด้วยการใช้ตัวเลือก -c คำสั่งจะลบตัวอักษรที่ไม่ใช่ตัวเลข เอาต์พุทต่อไปจะมีลักษณะดังนี้:
10879358
พิมพ์ไดเรกทอรี $PATH บนบรรทัดใหม่
ตัวแปรสภาพแวดล้อม $PATH เป็นรายการไดเรกทอรี (คั่นด้วยcolon) ที่บอก Shell ว่าจะค้นหาไฟล์ที่รันได้ในไดเรกทอรีใดเมื่อคุณพิมพ์คำสั่ง เพื่อพิมพ์แต่ละไดเรกทอรีบนบรรทัดใหม่แยกต่างหาก เราต้องจับคู่ colon (:) และแทนที่ด้วยคำสั่งบรรทัดใหม่:
echo $PATH | tr ':' '\n' /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin /usr/games /usr/local/games /snap/bin
วางแต่ละคำบนบรรทัดใหม่
เพื่อทำเช่นนี้ เราต้องจับคู่ตัวอักษรทั้งหมด (ที่ไม่ใช่ alphanumeric) และแทนที่ด้วยบรรทัดใหม่:
echo 'Linux is the best operating system in the world' | tr -cs '[:alnum:]'
เอาต์พุทคือ:
Linux is the best operating system in the world
แทนที่ตัวอักษร
หากเราต้องการแทนที่ตัวอักษรจาก standard input ('coding') ด้วยตัวอักษรที่สอดคล้องจากชุดที่สอง
echo 'coding' | tr 'co' 'hi'
แต่ละครั้งที่ "c" จะถูกแทนที่ด้วย "h" และ "o" ด้วย "i" ด้วยผลลัพธ์:
hiding
ชุดตัวอักษรก็สามารถกำหนดได้โดยใช้ช่วงตัวอักษร ตัวอย่างเช่น แทนที่จะเขียน:
echo 'coding' | tr 'abcd' 'wxyz'
คุณสามารถใช้:
echo 'coding' | tr 'a-d' 'w-z' yozing
เมื่อใช้ตัวเลือก -c tr จะแทนที่ตัวอักษรทั้งหมดที่ ไม่ใช่ ใน SET1
ในตัวอย่างต่อไปนี้ ตัวอักษรทั้งหมดยกเว้น "li" จะถูกแทนที่ด้วยตัวอักษรสุดท้ายจากชุดที่สอง:
$ echo 'coding' | tr -c 'cod' 'xy' liyyyiyyy
เพื่อ echo สตริงโดยไม่มีบรรทัดใหม่ ใช้ตัวเลือก -n
ตัวเลือก -d บอก tr ให้ลบตัวอักษรที่ระบุใน SET1 เมื่อคุณต้องการทำเช่นนี้โดยไม่บีบอัด คุณควรระบุชุดเดียวเท่านั้น
คำสั่งด้านล่างจะลบตัวอักษร l, I, และ z:
echo 'Linuxize' | tr -d 'liz'