Tôi phụ thuộc rất nhiều vào pcregrep, nhưng với grep mới hơn, bạn không cần phải cài đặt pcregrep cho nhiều tính năng của nó. Chỉ dùnggrep -P
.
Trong ví dụ về câu hỏi của OP, tôi nghĩ các tùy chọn sau hoạt động tốt, với kết quả phù hợp thứ hai với cách tôi hiểu câu hỏi:
grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*
Tôi đã sao chép văn bản dưới dạng / tmp / test1 và xóa 'g' và lưu dưới dạng / tmp / test2. Đây là kết quả đầu ra cho thấy chuỗi đầu tiên hiển thị chuỗi trùng khớp và chuỗi thứ hai chỉ hiển thị tên tệp (điển hình -o là hiển thị khớp và điển hình -l là chỉ hiển thị tên tệp). Lưu ý rằng 'z' là cần thiết cho đa dòng và '(. | \ N)' có nghĩa là khớp với 'bất kỳ thứ gì khác ngoài dòng mới' hoặc 'dòng mới' - tức là mọi thứ:
user@host:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes*
/tmp/test1:abc blah
blah blah..
blah blah..
blah blah..
blah efg
user@host:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes*
/tmp/test1
Để xác định xem phiên bản của bạn có đủ mới hay không, hãy chạy man grep
và xem nếu một cái gì đó tương tự như thế này xuất hiện gần đầu trang:
-P, --perl-regexp
Interpret PATTERN as a Perl regular expression (PCRE, see
below). This is highly experimental and grep -P may warn of
unimplemented features.
Đó là từ GNU grep 2.10.