Nếu grep của bạn không hỗ trợ -P hoặc --perl-regexp và bạn có thể cài đặt grep PCRE, ví dụ: "Pcregrep", hơn nó sẽ không cần bất kỳ tùy chọn dòng lệnh như GNU grep để chấp nhận biểu thức thông thường Perl-tương thích, bạn chỉ cần chạy
pcregrep "Ui\.(?!Line)"
Bạn không cần một nhóm lồng nhau cho "Line" như trong ví dụ của bạn "Ui. (?! (Line))" - nhóm bên ngoài là đủ, như tôi đã trình bày ở trên.
Để tôi cung cấp cho bạn một ví dụ khác về xác nhận tiêu cực: khi bạn có danh sách các dòng, được trả về bởi "ipset", mỗi dòng hiển thị số lượng gói ở giữa đường và bạn không cần dòng bằng 0 các gói dữ liệu, bạn chỉ cần chạy:
ipset list | pcregrep "packets(?! 0)"
Nếu bạn thích perl-tương thích biểu thức thông thường và có perl nhưng không có pcregrep hoặc grep bạn không hỗ trợ --perl-regexp, bạn có thể cho bạn một dòng perl tập lệnh hoạt động giống như grep:
perl -e "while (<>) {if (/Ui\.(?!Lines)/){print;};}"
Perl chấp nhận stdi n giống như grep, ví dụ:
ipset list | perl -e "while (<>) {if (/packets(?! 0)/){print;};}"
Nguồn
2017-04-22 06:26:22
Những loài phụ của regex - PCRE, ERE, BRE, grep, ed, sed, perl, python, Java, C, ...? –
Sử dụng nó với grep. –
Như một sang một bên, "sự kiện không tìm thấy" xuất phát từ việc sử dụng mở rộng lịch sử. Bạn có thể muốn tắt mở rộng lịch sử nếu bạn không bao giờ sử dụng nó và đôi khi muốn có thể sử dụng dấu chấm than trong các lệnh tương tác của mình. 'set + o histexpand' trong Bash hoặc' set + H', YMMV. – tripleee