Trong lệnh grep, tôi có thể thay đổi [: chữ số:] thành [0-9] không?


Câu trả lời:


15

Không, [0-9]không giống như [:digit:].

[0-9] khớp các chữ số từ 0 đến 9.

[:digit:] cũng khớp từ 0 đến 9 và các chữ số trong các ngôn ngữ không thuộc phương Tây (ví dụ: tiếng Ả Rập Đông).


Xin vui lòng, bạn có thể cung cấp một tên cụ thể cho, hoặc một liên kết (với một bảng) đến, (tốt nhất) bộ ký tự như vậy ngắn nhất?
agc

Ngoài ra, bạn có chắc chắn rằng '[0-9]' luôn chỉ khớp từ 0 đến 9? Có lẽ trong một số bộ ký tự khác, '[0-9]' kéo theo các ký tự khác.
agc

3
@agc [0-9]khớp với các tự ASCII theo nghĩa đen "0", "1", Mạnh , "9", giống như cách [A-Z]khớp với các ký tự ASCII "A" đến "Z". Các mẫu này được giới hạn trong ký tự ASCII được đặt theo định nghĩa. Mặt khác, [:digit:]chỉ định một lớp ký tự rộng hơn , cũng bao gồm các ký tự Unicode cho các chữ số trong các ngôn ngữ khác.
Guido

4
[charX-charY]ngụ ý mã thư viện cấp thấp tìm mã ký tự cho charX trong bộ ký tự hiện tại và tính từ đó đến mã cho charY . [A-Z]trên hệ thống ASCII khớp với 26 mã: {65, ... 90}. EBCDIC khớp với 41 mã: {193, ... 233}. [:upper:]sẽ luôn luôn phù hợp với chỉ có 26 mã trên ASCII, EBCDIC, vv Rất may, [0-9]phù hợp với 10 mã với ASCII hoặc mã EBCDIC - những gì không chắc chắn là liệu bất kỳ bộ ký tự tồn tại (hoặc sẽ tồn tại) mà [0-9]phù hợp với nhiều hơn hoặc ít hơn 10 mã. Nếu một bộ như vậy tồn tại, [:digit:]là hữu ích.
agc

4
@Guido Thực tế [A-Z]đôi khi khớp nhiều hơn các chữ cái ASCII: unix.stackexchange.com/questions/15980/. Mặt khác, tôi nghĩ rằng tất cả các vị trí còn tồn tại [0-9]chỉ khớp với các chữ số ASCII.
Gilles 'SO- ngừng trở nên xấu xa'

3

Chính xác [0-9]là chỉ được đảm bảo tương đương với [:digit:]nếu:

  • trình phân tích cú pháp regrec hỗ trợ [:digit:](nghĩa là nếu không, thì hiện tại [:digit:]có lẽ không làm như bạn nghĩ) và:

  • bộ ký tự đầu vào là một ký tự như ASCII trong đó các chữ số duy nhất là các ký tự 0- 9và chúng liền kề nhau. Điều này có thể không đúng trong (ví dụ) unicode (trong đó các chữ số có thể bao gồm các ký tự không phải là chữ số 0- 9) hoặc thậm chí trong các bộ ký tự 8 bit khác trong đó 0- 9có thể không liền kề (vì nó xảy ra trong EBCDIC các chữ số 0- 9liền kề) .

Ví dụ về các trường hợp ngoại lệ unicode được hiển thị ở đây . Như bạn có thể thấy tập hợp các ký tự unicode trong danh mục 'Số, Chữ số, Số thập phân' bao gồm nhiều hơn 10 chữ số ASCII khớp với [0-9]; nó bao gồm chỉ thị tiếng ả rập, tiếng ả rập mở rộng, ngo, v.v.

Thông tin thêm về các chữ số trong unicode có thể được tìm thấy ở đây .


Các chữ số ASCII liền kề và theo thứ tự ở tất cả các địa phương còn tồn tại, vì vậy đây [0-9]là một cách an toàn để khớp với chúng.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles chúng liền kề nhau trong ASCII nhưng không có trong tất cả các bộ ký tự 8 bit. Và sự thật là tất cả các chữ số đều liền kề nhau trong Unicode (vì có các chữ số khác [0-9])
abligh

2

Bạn có thể thay đổi [[:digit:]]thành [0-9]- lưu ý [:digit:]là bên trong […]. Điều này phụ thuộc vào mã hóa của đầu vào. Nếu đó là ASCII, tôi không nghĩ sẽ có vấn đề. Với các bảng mã khác, các chữ số có thể không liền kề hoặc phạm vi byte có thể khác nhau. Bạn cũng có thể bỏ lỡ các số đặc biệt trong các hệ thống viết khác.


1

'[: chữ số:]'về mặt lý thuyết di động hơn, lợi thế được rằng nó sẽ không phụ thuộc vào bộ ký tự vón cục địa phương của một chữ số tất cả cùng nhau.

Ví dụ liên quan: Với '[: upper:]' vs '[AZ]' không có sự khác biệt trong ASCII, nhưng có một sự khác biệt trên máy IBM cũ EBCDIC hệ thống, nơi '[AZ]' sẽ trải dài 41 ký tự không 26 (EBCDIC mã 193-233) và do đó sẽ khớp với EBCDIC "} \" et al.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.