Sẽ grep [0-9]
làm việc theo cách tương tự như grep [:digit:]
?
Sẽ grep [0-9]
làm việc theo cách tương tự như grep [:digit:]
?
Câu trả lời:
Không, [0-9]
là 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).
[0-9]
khớp với các ký 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.
[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.
[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.
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
- 9
và 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
- 9
có thể không liền kề (vì nó xảy ra trong EBCDIC các chữ số 0
- 9
liề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 .
[0-9]
là một cách an toàn để khớp với chúng.
[0-9]
)
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.
'[: chữ số:]' là 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ó là 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.