คำสั่ง tr (translate) ใน Linux อ่านข้อความจาก standard input ดำเนินการแก้ไขข้อความบางอย่าง แล้วส่งผลลัพธ์ไปยัง standard output บทความนี้อธิบายและแสดงว่าทำไมและอย่างไรคุณอาจใช้มัน
ไวยากรณ์คำสั่ง tr
นี่คือไวยากรณ์ที่คุณต้องใช้สำหรับคำสั่งนี้:
tr OPTIONS SET1 [SET2]
โปรดทราบว่า:
- OPTIONS ควรเป็นรายการตัวเลือกจากตารางด้านล่าง
- ตัวอักษรใน SET1 จะถูกแทนที่ด้วยตัวอักษรในตำแหน่งที่ตรงกันใน SET2
- ทั้งสอง SET เป็นตัวเลือก – บาง OPTIONS สามารถทำการแปลได้ด้วยตัวเอง จึงไม่จำเป็นต้องมีทั้งสอง SET เสมอไป
- คุณจะสังเกตเห็นว่าไม่มีข้อความที่จะประมวลผล – ข้อความนี้จะถูกส่งผ่านการส่งทิศทางมาตรฐาน – รายละเอียดเพิ่มเติมในตัวอย่างด้านล่าง
นี่คือ OPTIONS ที่มีอยู่ – ตามคู่มือผู้ใช้:
| OPTIONS | คำอธิบาย |
|---|---|
| -c | ใช้ค่ากลับ (complement) ของ SET1 |
| -d | ลบตัวอักษรใน SET1 ไม่ทำการแปล |
| -s | แทนที่ลำดับของตัวอักษรซ้ำซ้อนที่อยู่ใน SET ที่ระบุล่าสุด ด้วยตัวอักษรตัวเดียวของตัวอักษรนั้น |
| -t | ตัด SET1 ให้ยาวเท่ากับ SET2 ก่อน |
หากคุณต้องการแทนที่หรือลบตัวอักษรพิเศษ เช่น newline และ tab ใน SETs คุณสามารถใช้ลำดับต่อไปนี้:
| ลำดับที่ตีความ | ตัวอักษรพิเศษ |
|---|---|
| \NNN | ตัวอักษรที่มีค่าโคทัล NNN (1 ถึง 3 หลักโคทัล) |
| \\ | Backslash |
| \b | Backspace |
| \n | บรรทัดใหม่ (New line) |
| \r | Return |
| \t | แท็บแนวนอน (Horizontal tab) |
| [:alnum:] | ตัวอักษรและตัวเลขทั้งหมด |
| [:alpha:] | ตัวอักษรทั้งหมด |
| [:blank:] | ช่องว่างแนวนอนทั้งหมด |
| [:digit:] | ตัวเลขทั้งหมด |
| [:lower:] | ตัวอักษรพิมพ์เล็กทั้งหมด |
| [:space:] | ช่องว่างแนวนอนหรือแนวตั้งทั้งหมด |
| [:upper:] | ตัวอักษรพิมพ์ใหญ่ทั้งหมด |
ผมได้รวมเฉพาะตัวเลือก/ลำดับที่ใช้บ่อยๆ ไว้ข้างต้น (เพราะมีเยอะมาก) คุณสามารถดูรายการตัวเลือกคำสั่งทั้งหมดในคู่มือผู้ใช้ ซึ่งหาได้โดยรัน:
man tr
ตัวอย่างคำสั่ง tr
นี่คือตัวอย่างบางส่วนของวิธีใช้คำสั่ง tr
เหล่านี้เป็นเพียงตัวอย่าง คุณสามารถผสมผสานตัวเลือกและลำดับเพื่อให้ได้ผลลัพธ์ที่ต้องการเอง
การลบตัวอักษร
ตัวอย่างด้านล่างลบตัวอักษรที่ระบุออกจากสตริง ผลลัพธ์ของคำสั่ง echo จะถูก pipe ไปยังคำสั่ง tr
echo "axbxcxdx" | tr -d 'x'
ด้านบน ตัวเลือก -d สั่งให้ tr ลบตัวอักษร x ออกจากผลลัพธ์ของคำสั่ง echo
จะได้ผลลัพธ์:
abcd
ตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ (lowercase to UPPERCASE)
ตัวอย่างด้านล่างใช้ลำดับที่ตีความสำหรับ upper/lower เพื่อแทนที่ตัวอักษรพิมพ์เล็กทั้งหมดด้วยตัวพิมพ์ใหญ่:
echo "aBcDeFg" | tr '[:lower:]' '[:upper:]'
จะได้ผลลัพธ์:
ABCDEFG
การแทนที่ตัวอักษร
tr น่าจะใช้บ่อยที่สุดสำหรับแทนที่ตัวอักษรในสตริง – เช่น แทนที่ช่องว่างด้วยขีดกลาง:
echo "frogs and fish" | tr '[:blank:]' '-'
จะได้ผลลัพธ์:
frogs-and-fish
ตัวอย่างนี้ใช้สอง SET – SET แรกมีตัวระบุช่องว่าง/บลैंक (เช่น space, tab) SET ที่สองมีขีดกลาง – ดังนั้นช่องว่างจึงถูกแทนที่ด้วยขีดกลาง (SET2 แทนที่ SET1)
สิ่งนี้มีประโยชน์เมื่อสร้างชื่อไฟล์สำหรับอัปโหลดเว็บไซต์ และต้องการให้แน่ใจว่าไม่มีช่องว่างในชื่อไฟล์เหล่านั้น
การแทนที่หลายตัวอักษร
ในตัวอย่างก่อนหน้า แต่ละ SET มีเพียงตัวอักษรเดียว สามารถระบุหลายตัวอักษรเพื่อทำการแทนที่หลายอย่างพร้อมกันได้:
echo "frogs and fish" | tr 'sf' 'SF'
จะได้ผลลัพธ์:
FrogS and FiSh
ตามที่เห็น ตัวอักษรที่ตรงกันใน SET แรกถูกแทนที่ด้วยตัวอักษรจาก SET ที่สอง
การลบตัวอักษรซ้ำ
ด้านล่าง ลบช่องว่างซ้ำที่ไม่จำเป็นออกจากข้อความ:
echo 'Absolutely spaced out' | tr -s '[:space:]'
จะได้ผลลัพธ์:
Absolutely spaced out
ตัวระบุ [:blank:] ถูกใช้กับตัวเลือก -s เพื่อระบุและลบช่องว่างซ้ำ