Отрицательный взгляд назад / вперед в Linux менее пейджер (или vim)

14

Я хочу найти все экземпляры «index», за которыми не следует .php в журнале, используя less. /index(?!\.php)не работает. Это возможно? Что такое регулярное выражение для less и vim (они отличаются?). Разве это невозможно с соответствующими библиотеками регулярных выражений этих приложений?

Грегг Левенталь
источник
Для части почему см. Почему мое регулярное выражение работает в X, но не в Y?
Жиль "ТАК - перестань быть злым"

Ответы:

22

В vim, вы можете сделать так:

/index\(\.php\)\@!

Для получения более подробной информации, в командном режиме, попробуйте :h \@:

\@!     Matches with zero width if the preceding atom does NOT match at the
        current position. /zero-width {not in Vi}
        Like '(?!pattern)" in Perl.
        Example                 matches
        foo\(bar\)\@!           any "foo" not followed by "bar"
        a.\{-}p\@!              "a", "ap", "aap", "app", etc. not immediately
                                followed by a "p"
        if \(\(then\)\@!.\)*$   "if " not followed by "then"
cuonglm
источник
Прекрасный! Есть идеи за меньшее? Это не работает меньше. Я бы хотел, чтобы поведение регулярных выражений было PCRE везде, но, увы, нет.
Грегг Левенталь
7
Также обратите внимание на синтаксис для негативного внешнего вида :\@<!
lanoxx
Само собой разумеется , что с вам нужно поставить отрицательный взгляд позади перед рисунком. Пример: \(some\)\@<!thingбудет соответствовать thingи everythingи nothing, но нет something.
dwanderson
7

(?!\.php)является оператором регулярного выражения perl. lessобычно использует системный API регулярного выражения POSIX, поэтому обычно в расширенных регулярных выражениях GNU в системе GNU vimиспользуются vimрегулярные выражения.

В vim, как уже показано cuonglm, эквивалент index(?!\.php)будет index\(\.php\)\@!или \vindex(\.php)@!.

Поскольку lessво время компиляции вы можете выбрать библиотеку / API регулярных выражений и, как результат, тип регулярного выражения для использования:

    --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,
                    regcomp,regcomp-local,none}
        Select a regular expression library  auto

По умолчанию, однако, lessбудет использоваться POSIX regcompс REG_EXTENDED, поэтому вы получите расширенные регулярные выражения вашей системы, поэтому обычно что-то похожее с grep -E.

В расширенном регулярном выражении GNU нет аналогичного оператора просмотра или просмотра вперед.

Вы могли бы сделать это трудным путем:

index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))

С помощью lessвы можете использовать &ключ для фильтрации строк, содержащих index.php( &!index\.php), а затем искать index( /index). (вы все равно пропустите другие экземпляры, indexкоторые появляются в строке, также содержащей index.php).

Стефан Шазелас
источник
1
Я думаю, какая библиотека регулярных выражений lessзависит от времени компиляции.
cuonglm
@ Gnouc, ты прав, кажется, он даже сейчас поддерживает PCRE.
Стефан Шазелас
Да, мы можем проверить, если lessиспользует PCRE, анализируя вывод ldd $(which less). Но с другой библиотекой, вы знаете какой-нибудь способ проверить?
cuonglm
1
@Gnouc, он печатает имя библиотеки регулярных выражений с помощью less --version.
Стефан Шазелас
Я использую Ubuntu 12.04 LTS, и less --verionон печатает только less 444вместе с авторским правом.
cuonglm