Trong các phiên bản trước 2.19, GNU grep
's -w
sẽ chỉ xem xét alnums ký tự đơn byte và gạch dưới (như vậy trong miền địa phương UTF-8, chỉ có 26 + 26 + 10 + 1 (kí tự ASCII, chữ số và dấu gạch dưới)) như các thành phần từ. Vì vậy, ví dụ echo Stéphane | grep -w St
sẽ phù hợp. Điều đó đã được sửa trong 2.19.
Tuy nhiên, bạn có thể thực hiện logic bằng tay:
grep -E '([^[:alnum:]_.]|^)test([^[:alnum:]_.]|$)'
Điều đó được test
đi trước bởi một thành phần không từ hoặc bắt đầu của dòng và theo sau là một thành phần không từ hoặc kết thúc của dòng.
(ở trên [:alnum:]
khớp với các chữ số và chữ cái trong miền địa phương của bạn, không chỉ các chữ số ASCII, sửa lỗi ngôn ngữ thành C nếu bạn chỉ muốn các chữ số ASCII).
Nếu bạn không muốn bao gồm các thành phần không phải từ xung quanh trong trận đấu (ví dụ vì bạn đang sử dụng GNU -o
), thì lần này bạn có thể sử dụng các toán tử biểu thức PCRE và các toán tử tìm xung quanh:
grep -Po '(*UCP)(?<![\w.])test(?![\w.])'
Xóa (*UCP)
và thêm LC_ALL=C
để chỉ khớp các chữ cái và chữ số ASCII.
Việc sử dụng (*UCP)
khi bắt đầu một biểu thức chính quy cho thư viện PCRE rằng UniC̲ode P̲roperies phải được sử dụng cho \w
.
Nếu không có nó, \w
sẽ khớp với các chữ số và dấu gạch dưới của địa phương của bạn nhưng chỉ cho các ký tự một byte. Điều đó sẽ không hoạt động ở các địa phương UTF-8 (tiêu chuẩn hiện nay) khi chỉ có các ASCII mới được khớp. (*UCP)
làm cho nó hoạt động cho UTF-8 là tốt. Nó sẽ phù hợp dựa trên khái niệm thuộc tính riêng của PCRE có thể khác với ngôn ngữ địa phương của bạn, nhưng trên các hệ thống GNU, cũng giống như các định nghĩa miền địa phương UTF-8 không hoàn chỉnh và lỗi thời (ít nhất là vào năm 2015-04).