2013-12-18 12 views
9

tập tin login.txt của tôi chứa mục sauPositive/Negative lookahead với grep và perl

abc def 
abc 123 
def abc 
abc de 
tha ewe 

khi tôi làm lookahead tích cực sử dụng perl, tôi nhận được kết quả sau

cat login.txt | perl -ne 'print if /(?)abc\s(?=def)/' 
abc def 

khi tôi sử dụng grep tôi nhận được kết quả sau đây

cat login.txt | grep -P '(?<=abc)\s(?=def)' 
abc def 

kết quả tìm kiếm tiêu cực như sau từ perl và grep.

cat login | perl -ne 'print if /(?)abc\s(?!def)/' 
abc 123 
def abc 
abc de 

kết quả grep

cat login.txt | grep -P '(?<=abc)\s(?!def)' 
abc 123 
abc de 

perl phù hợp def abc cho lookahead tiêu cực. nhưng nó không nên phù hợp với def abc, như tôi đang kiểm tra abc sau đó def mẫu. grep trả lại kết quả chính xác.

có gì đó thiếu trong mẫu hình perl của tôi?

+0

'(?) Abc' không phải là một regex lookahead tích cực ở tất cả; bạn muốn '(? =) abc'. Đọc lại các tài liệu chặt chẽ hơn, tôi sẽ thừa nhận đó là một đọc vô cùng dày đặc và được học tốt nhất trong khi thử nghiệm ... – smci

Trả lời

6

grep không bao gồm dòng mới trong chuỗi mà nó kiểm tra so với regex, vì vậy abc\s không khớp khi abc ở cuối dòng. chomp trong perl hoặc sử dụng tùy chọn dòng lệnh -l và bạn sẽ thấy kết quả tương tự.

Tôi không chắc chắn lý do tại sao bạn đã thực hiện các thay đổi khác giữa regl perl và grep; (?) phải làm gì?

3

tôi sẽ cố gắng neo regex của bạn như vậy:

/(^abc\s+(?!def).+)/ 

này sẽ chụp:

abc 123 
abc de 

Các (?) vào đầu regex lookahead tiêu cực của bạn là không cần thiết

2

Trong perl -ne 'print if /(?)abc\s(?!def)/' của bạn bạn yêu cầu perl tìm thấy abc, sau đó khoảng trắng, thì chuỗi không được là def. Đây là kết quả phù hợp thành công với def abc, bởi vì không có def sau abc tại đây và \s đối sánh với dòng mới.