Положительный / отрицательный 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.