Search code examples
regexbashperlgrepregex-lookarounds

Positive/Negative lookahead with grep and perl


My login.txt file contains the following entries:

abc def
abc 123
def abc
abc de
tha ewe

When I do a positive lookahead using perl, I get the following result:

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

...when I use grep, I get the following result:

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

Negative lookahed results as follows from perl...:

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

...and the grep result:

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

perl matched the def abc for the negative lookahead. but it shouldn't have matched def abc, as I'm checking abc then def pattern; whereas grep returns the correct result.

Is something missing in my perl pattern?


Solution

  • grep does not include the newline in the string it checks against the regex, so abc\s does not match when abc is at the end of the line. chomp in perl or use the -l command line option and you will see similar results.

    I'm not sure why you were making other changes between the perl and grep regexes; what was the (?) supposed to accomplish?