Làm thế nào để nói với những người grep -w mà những nhân vật tạo nên những từ ngữ của Google?


7
$ printf 'asf .test. afd\nasaf foo-test asfdads\n'
asf .test. afd
asaf foo-test asfdads

$ printf 'asf .test. afd\nasaf foo-test asfdads\n' | grep -w test
asf .test. afd
asaf foo-test asfdads

Câu hỏi : Làm thế nào tôi có thể phù hợp với "foo-test"? Nói chính xác hơn, làm thế nào tôi có thể nói với "-w" sử dụng "-" làm dấu phân cách, nhưng không sử dụng "." ?

Hay nói cách khác, tôi có thể nói grepđó .là một trong số các nhân vật tạo nên từ và do đó không có ranh giới từ ở giữa .testkhông?

Hoặc có giải pháp nào khác ngoài grep?


Làm thế nào bạn có thể phù hợp với "foo-test"? grep cho "foo-test"? Tôi khá chắc chắn rằng tôi không hiểu câu hỏi của bạn.
Celada

Tôi đã cập nhật Câu hỏi.
freaking-good-question

Nhưng cả hai .-đã được phân tách: từ trang chủ: "Các ký tự cấu thành từ là chữ cái, chữ số và dấu gạch dưới."
Celada

Làm cách nào tôi có thể nói với "-w" sử dụng "-" làm dấu phân cách, nhưng không sử dụng "."?
freaking-good-question

vâng, và giải pháp không cần phải có trong grep
freaking-good-question

Câu trả lời:


10

Trong các phiên bản trước 2.19, GNU grep's -wsẽ 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 Stsẽ 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ó, \wsẽ 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).

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.