<ก่อนหน้านี้ | Contents | ถัดไป>
คลาสอักขระ POSIX
ช่วงอักขระดั้งเดิมเป็นวิธีที่เข้าใจได้ง่ายและมีประสิทธิภาพในการจัดการปัญหาการระบุชุดอักขระอย่างรวดเร็ว น่าเสียดายที่มันไม่ได้ผลเสมอไป ในขณะที่เราไม่พบปัญหาใด ๆ กับการใช้งานของเรา grep จนถึงตอนนี้ เราอาจประสบปัญหาในการใช้โปรแกรมอื่น
ย้อนกลับไปในบทที่ 4 เรามาดูวิธีการใช้ไวด์การ์ดเพื่อขยายชื่อพาธ ในการสนทนานั้น เรากล่าวว่าช่วงอักขระสามารถใช้ได้ในลักษณะที่เกือบจะเหมือนกันกับวิธีที่พวกเขาใช้ในนิพจน์ทั่วไป แต่นี่คือปัญหา:
[me@linuxbox ~]$ ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager
[me@linuxbox ~]$ ls /usr/sbin/[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager
(ขึ้นอยู่กับการกระจาย Linux เราจะได้รับรายการไฟล์ที่แตกต่างกัน อาจเป็นรายการที่ว่างเปล่า ตัวอย่างนี้มาจาก Ubuntu) คำสั่งนี้ให้ผลลัพธ์ที่คาดหวัง - รายการเฉพาะไฟล์ที่มีชื่อขึ้นต้นด้วยตัวพิมพ์ใหญ่ แต่:
[me@linuxbox ~]$ ls /usr/sbin/[AZ]*
/usr/sbin/biosdecode
/usr/sbin/แชท
/usr/sbin/chgpasswd
/usr/sbin/chpasswd
/usr/sbin/chroot
/usr/sbin/cleanup-info
/usr/sbin/บ่น
/usr/sbin/console-kit-daemon
[me@linuxbox ~]$ ls /usr/sbin/[AZ]*
/usr/sbin/biosdecode
/usr/sbin/แชท
/usr/sbin/chgpasswd
/usr/sbin/chpasswd
/usr/sbin/chroot
/usr/sbin/cleanup-info
/usr/sbin/บ่น
/usr/sbin/console-kit-daemon
ด้วยคำสั่งนี้ เราจะได้ผลลัพธ์ที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (แสดงเฉพาะรายการผลลัพธ์เพียงบางส่วนเท่านั้น) ทำไมถึงเป็นอย่างนั้น? เป็นเรื่องยาว แต่นี่เป็นเวอร์ชันสั้น:
ย้อนกลับไปเมื่อ Unix ได้รับการพัฒนาครั้งแรก มันรู้แค่เกี่ยวกับอักขระ ASCII และคุณสมบัตินี้สะท้อนถึงข้อเท็จจริงนั้น ใน ASCII อักขระ 32 ตัวแรก (ตัวเลข 0-31) คือรหัสควบคุม (เช่น แท็บ แบ็คสเปซ และการขึ้นบรรทัดใหม่) 32 (32-63) ถัดไปมีอักขระที่พิมพ์ได้ รวมถึงเครื่องหมายวรรคตอนส่วนใหญ่และตัวเลขศูนย์ถึงเก้า 32 ตัวถัดไป (ตัวเลข 64-95) ประกอบด้วยอักษรตัวพิมพ์ใหญ่และเครื่องหมายวรรคตอนอีกสองสามตัว 31 สุดท้าย (ตัวเลข 96-127) ประกอบด้วยตัวอักษรพิมพ์เล็กและเครื่องหมายวรรคตอนเพิ่มเติม ตามข้อตกลงนี้ ระบบที่ใช้ ASCII ใช้ a ลำดับการเรียง ที่มีลักษณะดังนี้:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ซึ่งแตกต่างจากลำดับพจนานุกรมที่เหมาะสม ซึ่งมีลักษณะดังนี้: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
เนื่องจากความนิยมของ Unix แพร่กระจายไปทั่วสหรัฐอเมริกา จึงมีความต้องการสนับสนุนอักขระที่ไม่พบในภาษาอังกฤษแบบสหรัฐอเมริกาเพิ่มขึ้น ตาราง ASCII ถูกขยายให้ใช้แปดบิตเต็ม โดยเพิ่มอักขระหมายเลข 128-255 ซึ่งรองรับภาษาอื่นๆ อีกมากมาย เพื่อรองรับความสามารถนี้ มาตรฐาน POSIX ได้แนะนำแนวคิดที่เรียกว่า a ในประเทศซึ่งสามารถปรับเปลี่ยนเพื่อเลือกชุดอักขระที่จำเป็นสำหรับสถานที่เฉพาะได้ เราสามารถเห็นการตั้งค่าภาษาของระบบของเราโดยใช้คำสั่งนี้:
[me@linuxbox ~]$ เสียงสะท้อน $LANG
th_US.UTF-8
[me@linuxbox ~]$ เสียงสะท้อน $LANG
th_US.UTF-8
ด้วยการตั้งค่านี้ แอปพลิเคชันที่สอดคล้องกับ POSIX จะใช้ลำดับการเรียงพจนานุกรมแทนคำสั่ง ASCII ซึ่งจะอธิบายลักษณะการทำงานของคำสั่งด้านบน ช่วงอักขระของ [AZ] เมื่อแปลตามลำดับพจนานุกรมจะรวมตัวอักษรทั้งหมดยกเว้นตัวพิมพ์เล็ก "a" ดังนั้นผลลัพธ์ของเรา
เพื่อแก้ปัญหานี้บางส่วน มาตรฐาน POSIX ได้รวมคลาสอักขระจำนวนหนึ่งซึ่งมีช่วงของอักขระที่มีประโยชน์ ได้อธิบายไว้ในตารางว่า-
ต่ำ:
ตารางที่ 19-2: คลาสอักขระ POSIX
คำอธิบายคลาสตัวละคร
คำอธิบายคลาสตัวละคร
[:alnum:] อักขระที่เป็นตัวอักษรและตัวเลขคละกัน ใน ASCII เทียบเท่ากับ:
[อา-ซ่า-z0-9]
[:คำ:] เช่นเดียวกับ [:alnum:] โดยเพิ่มขีดล่าง (_) อักขระ.
[:alpha:] ตัวอักษร ใน ASCII เทียบเท่ากับ:
[อา-ซ่า-ซ]
[:blank:] รวมอักขระช่องว่างและแท็บ
[:ควบคุม:] รหัสควบคุม ASCII รวมอักขระ ASCII 0 ถึง 31 และ 127
[:digit:] ตัวเลขศูนย์ถึงเก้า
[:graph:] อักขระที่มองเห็นได้ ใน ASCII จะมีอักขระ 33
ผ่าน 126
[:lower:] ตัวพิมพ์เล็ก
[:punct:] อักขระเครื่องหมายวรรคตอน ใน ASCII เทียบเท่ากับ:
[-!"#$%&'()*+,./:;<=>?@[\\\]_`{|}~]
[:print:] อักขระที่สามารถพิมพ์ได้ ตัวละครทั้งหมดใน [:กราฟ:]
บวกกับอักขระช่องว่าง
[:space:] อักขระช่องว่างรวมถึงช่องว่าง, แท็บ, แคร่ตลับหมึก
กลับ ขึ้นบรรทัดใหม่ แท็บแนวตั้ง และฟีดแบบฟอร์ม ใน ASCII เทียบเท่ากับ:
[ \t\r\n\v\f]
[:upper:] อักขระตัวพิมพ์ใหญ่
[:xdigit:] อักขระที่ใช้แสดงเลขฐานสิบหก ใน ASCII เทียบเท่ากับ:
[0-9A-ฟ้า-ฉ]
แม้แต่กับคลาสอักขระ ก็ยังไม่มีวิธีที่สะดวกในการแสดงช่วงบางส่วน เช่น [AM]
การใช้คลาสอักขระ เราสามารถทำซ้ำรายการไดเร็กทอรีของเราและดูผลลัพธ์ที่ดีขึ้น:
[me@linuxbox ~]$ ls /usr/sbin/[[:บน:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager
[me@linuxbox ~]$ ls /usr/sbin/[[:บน:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager
อย่างไรก็ตาม โปรดจำไว้ว่านี่ไม่ใช่ตัวอย่างของนิพจน์ทั่วไป แต่เป็นการขยายชื่อพาธที่ทำงานของเชลล์ เราแสดงไว้ที่นี่เพราะคลาสอักขระ POSIX สามารถใช้ได้ทั้งคู่
เปลี่ยนกลับเป็นลำดับการเรียงแบบดั้งเดิม
คุณสามารถเลือกให้ระบบของคุณใช้ลำดับการเรียงแบบดั้งเดิม (ASCII) ได้โดยการเปลี่ยนค่าของ ภาษา ตัวแปรสภาพแวดล้อม ดังที่เราเห็นข้างต้น ภาษา ตัวแปรมีชื่อของภาษาและชุดอักขระที่ใช้ในสถานที่ของคุณ ค่าเริ่มต้นนี้ถูกกำหนดเมื่อคุณเลือกภาษาการติดตั้งขณะที่ติดตั้ง Linux
หากต้องการดูการตั้งค่าสถานที่ ให้ใช้ปุ่ม ในประเทศ คำสั่ง:
[me@linuxbox ~]$ ในประเทศ LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF- 8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="en_US.UTF-8" LC_NAME="en_US.UTF-8" LC_ADDRESS="en_US.UTF-8" LC_TELEPHONE="en_US.UTF-8" LC_MEASUREMENT=" en_US.UTF-8" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL=
หากต้องการเปลี่ยนโลแคลเพื่อใช้พฤติกรรมยูนิกซ์แบบดั้งเดิม ให้ตั้งค่า ภาษา ตัวแปรถึง POSIX:
[me@linuxbox ~]$ ส่งออก LANG=POSIX
โปรดทราบว่าการเปลี่ยนแปลงนี้จะแปลงระบบให้ใช้ภาษาอังกฤษแบบสหรัฐอเมริกา (โดยเฉพาะอย่างยิ่ง ASCII) สำหรับชุดอักขระ ดังนั้นโปรดแน่ใจว่านี่คือสิ่งที่คุณต้องการจริงๆ
คุณสามารถทำการเปลี่ยนแปลงนี้อย่างถาวรได้โดยเพิ่มบรรทัดนี้ถึงคุณ .bashrc
ไฟล์:
ส่งออก LANG=POSIX