Положительный / отрицательный lookahead с grep и perl

мой логин.текстовый файл содержит следующие записи

abc def
abc 123
def abc
abc de
tha ewe

когда я делаю положительный lookahead с помощью perl, я получаю следующий результат

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

когда я использую grep, я получаю следующий результат

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

отрицательные результаты lookahed следующим образом от perl и grep.

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

результат команды grep

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

perl соответствовал Def abc для отрицательного lookahead. но он не должен соответствовать def abc, поскольку я проверяю abc затем def pattern. grep возвращает правильный результат.

что-то не хватает в моем шаблоне perl ?

3 ответов


grep не включает новую строку в строку, которую он проверяет на регулярное выражение, поэтому abc\s не соответствует, когда abc находится в конце строки. chomp в perl или используйте параметр командной строки-l, и вы увидите аналогичные результаты.

Я не уверен, почему вы делали другие изменения между Perl и grep regexes; что было (?) должен выполнить?


Я бы попытался закрепить ваше регулярное выражение так:

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

это запечатлеть:

abc 123
abc de

на (?) в начале вашего отрицательного регулярного выражения lookahead является избыточным


в своем perl -ne 'print if /(?)abc\s(?!def)/' вы просите perl найти abc, затем пробел, затем строка не должна быть def. Это успешно соответствует def abc, потому что нет def после abc здесь \s матчи с newline.