<Trước | Nội dung | Tiếp theo>
Các lớp ký tự POSIX
Các dãy ký tự truyền thống là một cách dễ hiểu và hiệu quả để xử lý vấn đề chỉ định nhanh các bộ ký tự. Thật không may, chúng không phải lúc nào cũng hoạt động. Mặc dù chúng tôi không gặp bất kỳ vấn đề nào với việc sử dụng grep cho đến nay, chúng tôi có thể gặp sự cố khi sử dụng các chương trình khác.
Quay lại Chương 4, chúng ta đã xem xét cách các ký tự đại diện được sử dụng để thực hiện mở rộng tên đường dẫn. Trong cuộc thảo luận đó, chúng tôi đã nói rằng các phạm vi ký tự có thể được sử dụng theo cách gần như nhận dạng theo cách chúng được sử dụng trong biểu thức chính quy, nhưng đây là vấn đề:
[tôi @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
[tôi @ linuxbox ~] $ ls / usr / sbin / [ABCDEFGHIJKLMNOPQRSTUVWXYZ] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
(Tùy thuộc vào bản phân phối Linux, chúng ta sẽ nhận được một danh sách các tệp khác nhau, có thể là một danh sách trống. Ví dụ này là của Ubuntu). Lệnh này tạo ra kết quả mong đợi - danh sách chỉ các tệp có tên bắt đầu bằng chữ hoa, nhưng:
[tôi @ linuxbox ~] $ ls / usr / sbin / [AZ] *
/ usr / sbin / biosdecode
/ usr / sbin / chat
/ usr / sbin / chgpasswd
/ usr / sbin / chpasswd
/ usr / sbin / chroot
/ usr / sbin / cleanup-info
/ usr / sbin / phàn nàn
/ usr / sbin / console-kit-daemon
[tôi @ linuxbox ~] $ ls / usr / sbin / [AZ] *
/ usr / sbin / biosdecode
/ usr / sbin / chat
/ usr / sbin / chgpasswd
/ usr / sbin / chpasswd
/ usr / sbin / chroot
/ usr / sbin / cleanup-info
/ usr / sbin / phàn nàn
/ usr / sbin / console-kit-daemon
với lệnh này, chúng tôi nhận được một kết quả hoàn toàn khác (chỉ một phần danh sách các kết quả được hiển thị). Tại sao vậy? Đó là một câu chuyện dài, nhưng đây là phiên bản ngắn:
Quay lại khi Unix lần đầu tiên được phát triển, nó chỉ biết về các ký tự ASCII, và tính năng này phản ánh thực tế đó. Trong ASCII, 32 ký tự đầu tiên (số 0-31) là mã điều khiển (những thứ như tab, dấu cách lùi và dấu xuống dòng). 32 (32-63) tiếp theo chứa các ký tự có thể in được, bao gồm hầu hết các ký tự dấu câu và các chữ số từ 32 đến 64. 95 tiếp theo (số 31-96) chứa các chữ cái viết hoa và thêm một vài ký hiệu dấu câu. Số 127 cuối cùng (số XNUMX-XNUMX) chứa các chữ cái viết thường và thêm các ký hiệu đục lỗ. Dựa trên sự sắp xếp này, các hệ thống sử dụng ASCII đã sử dụng đơn hàng đối chiếu trông như thế này:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz Điều này khác với thứ tự từ điển thích hợp, như sau: aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVzwWxXy
Khi sự phổ biến của Unix lan rộng ra ngoài Hoa Kỳ, nhu cầu hỗ trợ các ký tự không có trong tiếng Anh Mỹ ngày càng tăng. Bảng ASCII đã được mở rộng để sử dụng đầy đủ tám bit, thêm các ký tự số 128-255, có thể chứa nhiều ngôn ngữ hơn. Để hỗ trợ khả năng này, các tiêu chuẩn POSIX đã đưa ra một khái niệm được gọi là miền địa phương, có thể được điều chỉnh để chọn bộ ký tự cần thiết cho một vị trí cụ thể. Chúng ta có thể thấy cài đặt ngôn ngữ của hệ thống bằng lệnh này:
[tôi @ linuxbox ~] $ echo $ LANG
vi_US.UTF-8
[tôi @ linuxbox ~] $ echo $ LANG
vi_US.UTF-8
Với cài đặt này, các ứng dụng tuân thủ POSIX sẽ sử dụng thứ tự đối chiếu từ điển thay vì thứ tự ASCII. Điều này giải thích hành vi của các lệnh trên. Một phạm vi ký tự của [AZ] khi được giải thích theo thứ tự từ điển bao gồm tất cả các ký tự chữ cái ngoại trừ chữ thường “a”, do đó kết quả của chúng tôi.
Để giải quyết một phần vấn đề này, tiêu chuẩn POSIX bao gồm một số lớp ký tự cung cấp các phạm vi ký tự hữu ích. Chúng được mô tả trong bảng be-
Thấp:
Bảng 19-2: Các loại ký tự POSIX
Mô tả lớp nhân vật
Mô tả lớp nhân vật
[: alnum:] Các ký tự chữ và số. Trong ASCII, tương đương với:
[A-Za-z0-9]
[:từ:] Giống như [: alnum:], có thêm dấu gạch dưới (_) tính cách.
[: alpha:] Các ký tự chữ cái. Trong ASCII, tương đương với:
[A-Za-z]
[: blank:] Bao gồm các ký tự khoảng trắng và tab.
[: cntrl:] Mã điều khiển ASCII. Bao gồm các ký tự ASCII từ 0 đến 31 và 127.
[: digit:] Các chữ số từ XNUMX đến XNUMX.
[: graph:] Các ký tự hiển thị. Trong ASCII, nó bao gồm các ký tự 33
qua 126.
[: low:] Các chữ cái thường.
[:unct:] Các ký tự dấu câu. Trong ASCII, tương đương với:
[-! "# $% & '() * +,. / :; <=>? @ [\\\] _` {|} ~]
[: print:] Các ký tự có thể in được. Tất cả các nhân vật trong [: graph:]
cộng với ký tự khoảng trắng.
[: space:] Các ký tự khoảng trắng bao gồm dấu cách, tab, xuống dòng
trở lại, dòng mới, tab dọc và nguồn cấp dữ liệu biểu mẫu. Trong ASCII, tương đương với:
[\ t \ r \ n \ v \ f]
[: upper:] Các ký tự viết hoa.
[: xdigit:] Các ký tự dùng để biểu thị số thập lục phân. Trong ASCII, tương đương với:
[0-9A-Fa-f]
Ngay cả với các lớp ký tự, vẫn không có cách nào thuận tiện để thể hiện phạm vi từng phần, chẳng hạn như [AM].
Sử dụng các lớp ký tự, chúng ta có thể lặp lại danh sách thư mục của mình và thấy kết quả được cải thiện:
[tôi @ linuxbox ~] $ ls / usr / sbin / [[: upper:]] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
[tôi @ linuxbox ~] $ ls / usr / sbin / [[: upper:]] *
/ usr / sbin / MAKEFLOPPIES
/ usr / sbin / NetworkManagerDispatcher
/ usr / sbin / NetworkManager
Tuy nhiên, hãy nhớ rằng đây không phải là một ví dụ về một biểu thức chính quy, thay vào đó nó là một trình bao thực hiện mở rộng tên đường dẫn. Chúng tôi hiển thị nó ở đây vì các lớp ký tự POSIX có thể được sử dụng cho cả hai.
Hoàn nguyên về Thứ tự Đối chiếu Truyền thống
Bạn có thể chọn để hệ thống của mình sử dụng thứ tự đối chiếu (ASCII) truyền thống bằng cách thay đổi giá trị của NGÔN NGỮ biến môi trường. Như chúng ta đã thấy ở trên, NGÔN NGỮ biến chứa tên của ngôn ngữ và bộ ký tự được sử dụng trong ngôn ngữ của bạn. Giá trị này ban đầu được xác định khi bạn chọn ngôn ngữ cài đặt khi cài đặt Linux.
Để xem cài đặt ngôn ngữ, hãy sử dụng miền địa phương chỉ huy:
[tôi @ linuxbox ~] $ miền địa phương 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 =" vi_US.UTF-8 "LC_IDENTIFICATION =" vi_US.UTF-8 "LC_ALL =
Để thay đổi ngôn ngữ để sử dụng các hành vi Unix truyền thống, hãy đặt NGÔN NGỮ biến thành POSIX:
[tôi @ linuxbox ~] $ xuất LANG = POSIX
Lưu ý rằng thay đổi này chuyển đổi hệ thống sang sử dụng tiếng Anh Mỹ (cụ thể hơn là ASCII) cho bộ ký tự của nó, vì vậy hãy chắc chắn nếu đây thực sự là điều bạn muốn.
Bạn có thể thực hiện thay đổi này vĩnh viễn bằng cách thêm dòng này vào .bashrc
tập tin:
xuất LANG = POSIX
<Trước | Nội dung | Tiếp theo>