ที่เป็นที่รู้จักกัน ( 1 , 2 , 3 , 4 , 5 , 6 ) ข้อ จำกัด tr
ของการดำเนินงานของกนู
ไม่ใช่ว่าไม่รองรับอักขระต่างประเทศไม่ใช่ภาษาอังกฤษหรือไม่ใช่ ASCII แต่ไม่รองรับอักขระหลายไบต์
อักขระซิริลลิกเหล่านั้นจะถือว่าใช้ได้ถ้าเขียนในชุดอักขระ iso8859-5 (ไบต์เดียวต่ออักขระ) (และโลแคลของคุณใช้ชุดอักขระนั้น) แต่ปัญหาของคุณคือคุณใช้ UTF-8 ซึ่งไม่ใช่ ASCII อักขระถูกเข้ารหัสใน 2 หรือมากกว่าไบต์
GNU มีแผน (ดูเพิ่มเติม ) เพื่อแก้ไขปัญหานี้และงานนั้นกำลังดำเนินการอยู่
FreeBSD หรือ Solaris tr
ไม่มีปัญหา
ในเวลาเฉลี่ยสำหรับกรณีการใช้งานส่วนใหญ่tr
คุณสามารถใช้ GNU sed หรือ GNU awk ซึ่งรองรับอักขระหลายไบต์
ตัวอย่างเช่น:
tr -cs '[[:alpha:][:space:]]' ' '
สามารถเขียนได้:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
หรือ:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
วิธีแปลงระหว่างตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ ( tr '[:upper:]' '[:lower:]'
):
gsed 's/[[:upper:]]/\l&/g'
(นั่นl
คือตัวพิมพ์เล็กL
ไม่ใช่1
ตัวเลข)
หรือ:
gawk '{print tolower($0)}'
สำหรับการพกพาperl
เป็นอีกทางเลือกหนึ่ง:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
หากคุณรู้ว่าข้อมูลสามารถแสดงในชุดอักขระไบต์เดียวจากนั้นคุณสามารถประมวลผลข้อมูลในชุดอักขระนั้น:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8