Ranh giới từ Grep


22

Tích lũy tài liệu GNU:

‘\<’ Match the empty string at the beginning of word.
‘\>’ Match the empty string at the end of word.

My / etc / fstab trông như thế này:

/dev/sdb1       /media/fresh      ext2   defaults     0 0

Tôi muốn grep trả lại TRUE / FALSE cho sự tồn tại của / media / Fresh. Tôi đã thử sử dụng \<và \>nó không hoạt động. Tại sao?

egrep '\</media/fresh\>' /etc/fstab

Cách giải quyết:

egrep '[[:blank:]]/media/fresh[[:blank:]]' /etc/fstab

Nhưng nó trông xấu hơn.

Grep của tôi là 2.5.1


4
Tôi cho rằng /không được coi là một ký tự từ, vì vậy regex sẽ không khớp - "\ b khớp với trước và sau một chuỗi chữ số" chính xác hơn là nói "trước và sau một từ"
— Felipe Alvarez

Câu trả lời:


27

\<và \>khớp chuỗi trống ở đầu và cuối của một từ tương ứng và chỉ các ký tự cấu thành từ là:

[[:alnum:]_]

Từ man grep:

Word-constituent characters are letters, digits, and the underscore.

Vì vậy, Regex của bạn không thành công vì /không phải là ký tự cấu thành từ hợp lệ.

Thay vào đó khi bạn có khoảng trắng xung quanh, bạn có thể sử dụng -wtùy chọn grepkhớp với một từ:

grep -wo '/media/fresh' /etc/fstab

Thí dụ:

$ grep -wo '/media/fresh' <<< '/dev/sdb1       /media/fresh      ext2   defaults     0 0'
/media/fresh

Tôi số liệu nhiều như sau khi tôi đăng Câu hỏi của tôi. Bất kỳ đề nghị cho những gì tôi muốn đạt được?
— Felipe Alvarez

@FelipeAlvarez Kiểm tra các chỉnh sửa của tôi ..
— heemayl

1

Vấn đề này với \<(và cũng \b) không chỉ áp dụng /cho tất cả các ký tự không phải từ. (tức là các ký tự khác [[:alnum:]]và _.)

Vấn đề là công cụ regex sẽ luôn bỏ qua một ký tự không phải từ như /khi tìm kiếm neo tiếp theo \<. Đó là lý do tại sao bạn không nên đặt các ký tự không phải từ như /sau \<. Nếu bạn làm, bằng cách xây dựng, không có gì sẽ phù hợp.

Một thay thế cho -wtùy chọn của grep, sẽ là một cái gì đó như thế này:

egrep "(^|\W)/media/fresh($|\W)"
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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.