เวิร์กสเตชันออนไลน์ของ OnWorks Linux และ Windows

โลโก้

ฟรีโฮสติ้งออนไลน์สำหรับเวิร์กสเตชัน

<ก่อนหน้านี้ | 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


ระบบปฏิบัติการคลาวด์คอมพิวติ้งยอดนิยมที่ OnWorks: