Positive/Negative lookahead with grep and perl

前端 未结 4 2249
猫巷女王i
猫巷女王i 2021-02-19 07:14

my login.txt file contains following entries

abc def
abc 123
def abc
abc de
tha ewe

when i do the positive lookahead using perl, i\'m getting t

4条回答
  •  伪装坚强ぢ
    2021-02-19 07:43

    perl -ne 'print if /(?)abc\s(?!def)/'
    

    To begin, as fugi stated, the (?) is an empty non-capturing group, and matches anything, so it does nothing.

    Therefore as written, this regex matches the literal string abc followed by a single [:space:OR:tab:OR:newline], not followed by the literal string def.

    Because \s matches a newline character and you did not chomp the trailing newline characters as you processed each line, def abc matches because (?)abc\s in the regex matches abc[:newline:] which is followed by $ (the end-of-line anchor, not def).

    The corrected regex (accounting for the redundant (?)) would be:

    perl -ne 'print if /(?<=abc)\s(?!def)/'
    

    ...which matches a single [:space:OR:tab:OR:newline] which is preceded by abc and not followed by def.

    This still will match def abc, because once again, \s matches the [:newline:], which is preceded by abc and followed by $ (the end-of-line anchor, not def).

    Either chomp the [:newline:] before evaluating the regex in Perl, or use the character class [ \t] (if you need to account for tab characters) instead of \s:

    perl -ne 'print if /(?<=abc)[ \t](?!def)/'
    

    Or simply

    perl -ne 'print if /(?<=abc) (?!def)/'
    

提交回复
热议问题