แม้ว่าจะตอบ / ยอมรับเมื่อหลายปีก่อน แต่คำตอบที่ยอมรับในปัจจุบันนั้นถูกต้องสำหรับการเข้ารหัสแบบหนึ่งไบต์ต่ออักขระเช่น iso-8859-1 หรือสำหรับชุดย่อยแบบไบต์เดี่ยวของชุดอักขระไบต์ตัวแปร (เช่นอักขระละติน ภายใน UTF-8) แม้จะใช้การต่อแบบหลายไบต์แทนก็ยังใช้ได้เฉพาะกับการเข้ารหัสแบบหลายไบต์คงที่เช่น UTF-16 เนื่องจากตอนนี้ UTF-8 อยู่ในขั้นที่จะเป็นมาตรฐานสากลได้ดีและเมื่อดูรายชื่อภาษานี้ตามจำนวนเจ้าของภาษาและรายชื่อภาษา 30 อันดับแรกตามการใช้งานของเจ้าของภาษา / รองสิ่งสำคัญคือต้องชี้ให้เห็น เทคนิคที่เป็นมิตรกับอักขระแบบไบต์แบบง่าย (ไม่ใช่ไบต์) โดยใช้cut -c
และtr
/ sed
กับคลาสอักขระ
เปรียบเทียบสิ่งต่อไปนี้ที่ล้มเหลวเป็นสองเท่าเนื่องจากข้อผิดพลาด / ข้อสันนิษฐานที่ใช้ภาษาละตินเป็นศูนย์กลางสองประการเกี่ยวกับปัญหาไบต์กับอักขระ (หนึ่งคือhead
เทียบกับcut
อีกปัญหาหนึ่งคือเทียบ[a-z][A-Z]
กับ[:upper:][:lower:]
):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ head -c 1 | \
$ sed -e 's/[A-Z]/[a-z]/g'
[[unreadable binary mess, or nothing if the terminal filtered it]]
สำหรับสิ่งนี้ (หมายเหตุ: สิ่งนี้ใช้ได้ดีกับ FreeBSD แต่ทั้งสองcut
& tr
บน GNU / Linux ยังคงสับสนภาษากรีกใน UTF-8 สำหรับฉัน):
$ printf 'Πού μπορώ να μάθω σανσκριτικά;\n' | \
$ cut -c 1 | \
$ tr '[:upper:]' '[:lower:]'
π
อีกคำตอบล่าสุดได้เสนอ "ตัด" แล้ว แต่เป็นเพียงเพราะปัญหาด้านข้างที่สามารถใช้เพื่อระบุการชดเชยตามอำเภอใจไม่ใช่เพราะอักขระที่เกี่ยวข้องโดยตรงกับปัญหาไบต์
หากคุณcut
จัดการ-c
กับการเข้ารหัสไบต์ตัวแปรไม่ถูกต้องสำหรับ " X
อักขระตัวแรก" (แทนที่X
ด้วยตัวเลขของคุณ) คุณสามารถลอง:
sed -E -e '1 s/^(.{X}).*$/\1/' -e q
- ซึ่ง จำกัด ไว้ที่บรรทัดแรก
head -n 1 | grep -E -o '^.{X}'
- ซึ่ง จำกัด ไว้ที่บรรทัดแรกและเชื่อมโยงคำสั่งสองคำสั่ง
dd
- ซึ่งได้รับการแนะนำในคำตอบอื่น ๆ แล้ว แต่ก็ยุ่งยากจริงๆ
sed
สคริปต์ที่ซับซ้อนพร้อมด้วยบัฟเฟอร์หน้าต่างบานเลื่อนเพื่อจัดการกับอักขระที่กระจายอยู่ในหลายบรรทัด แต่อาจยุ่งยาก / เปราะบางมากกว่าการใช้สิ่งต่างๆเช่นdd
หากคุณtr
ไม่จัดการคลาสอักขระที่มีการเข้ารหัสไบต์ตัวแปรอย่างถูกต้องคุณสามารถลอง:
sed -E -e 's/[[:upper:]]/\L&/g
(GNU เฉพาะ)
mkfifo /tmp/test.fifo; echo "hello world">/tmp/test.fifo & head -c 5 /tmp/test.fifo
ยังบริโภค" world\n"
ที่สูญหายไปตลอดกาล