ทำให้มันง่าย - หาง
เราไม่ควรต้องการนิพจน์ทั่วไปหรือมากกว่าหนึ่งโพรเซสเพื่อนับจำนวนตัวอักษร
คำสั่งtail
มักใช้เพื่อแสดงบรรทัดสุดท้ายของไฟล์มีตัวเลือก-c
( --bytes
) ซึ่งดูเหมือนจะเป็นเครื่องมือที่เหมาะสมสำหรับสิ่งนี้:
$ printf 123456789 | tail -c 3
789
(เมื่อคุณอยู่ในเชลล์คุณควรใช้วิธีการเช่นเดียวกับคำตอบของ mikeserv เพราะจะช่วยประหยัดการเริ่มต้นกระบวนการสำหรับtail
)
อักขระ Unicode จริง
ตอนนี้คุณขอตัวละครสามตัวสุดท้าย; นั่นไม่ใช่สิ่งที่คำตอบนี้ให้คุณ: มันแสดงผลสามไบต์ล่าสุด!
ตราบใดที่อักขระแต่ละตัวมีหนึ่งไบต์tail -c
ก็ใช้งานได้ ดังนั้นจึงสามารถนำมาใช้ถ้าตั้งค่าตัวอักษรเป็นASCII
,ISO 8859-1
หรือตัวแปร
หากคุณมีอินพุต Unicode เช่นเดียวกับในUTF-8
รูปแบบทั่วไปผลลัพธ์จะผิด:
$ printf 123αβγ | tail -c 3
�γ
ในตัวอย่างนี้การใช้UTF-8
อักขระกรีกอัลฟาเบต้าและแกมม่ามีความยาวสองไบต์:
$ printf 123αβγ | wc -c
9
ตัวเลือก-m
อย่างน้อยสามารถนับอักขระ Unicode จริง:
printf 123αβγ | wc -m
6
ตกลงดังนั้น 6 ไบต์สุดท้ายจะให้อักขระ 3 ตัวสุดท้าย:
$ printf 123αβγ | tail -c 6
αβγ
ดังนั้นจึงtail
ไม่รองรับการจัดการตัวอักษรทั่วไปและไม่ได้ลอง (ดูด้านล่าง): มันจัดการกับเส้นขนาดตัวแปร แต่ไม่มีตัวอักษรขนาดตัวแปร
ลองคิดแบบนี้: tail
มันเหมาะกับโครงสร้างของปัญหาที่จะแก้ไข แต่มันผิดสำหรับข้อมูล
coreutils ของ GNU
มองต่อไปก็ปรากฎว่าเจ้า coreutils GNU คอลเลกชันของเครื่องมือพื้นฐานที่ชอบsed
, ls
, tail
และcut
จะยังไม่สากลอย่างเต็มที่ ซึ่งส่วนใหญ่เกี่ยวกับการสนับสนุน Unicode
ตัวอย่างเช่นcut
จะเป็นผู้สมัครที่ดีที่จะใช้แทนหางที่นี่เพื่อรองรับตัวละคร; มันมีตัวเลือกสำหรับการทำงานกับไบต์หรือตัวอักษร-c
( --bytes
) และ-m
(--chars
);
เฉพาะที่เป็น-m
/ --chars
เป็นรุ่น
cut (GNU coreutils) 8.21
2013
ไม่ได้ดำเนินการ!
จากinfo cut
:
`-c CHARACTER-LIST'
`--characters=CHARACTER-LIST'
Select for printing only the characters in positions listed in CHARACTER-LIST.
The same as `-b' for now, but internationalization will change that.
ดูเพิ่มเติมที่คำตอบนี้เพื่อไม่สามารถใช้ `cut -c` (` --characters`) กับ UTF-8 ได้? .
grep -o '.\{3\}$'