Негативні твердження позаду / вперед твердження в Linux з меншим пейджером (або vim)


14

Я хочу знайти в журналі всі екземпляри "index", за якими не рухається .php less. /index(?!\.php)не працює. Чи можливо це? Що таке регулярне вираження для менших та vim (чи відрізняються вони?). Чи це неможливо з відповідними бібліотеками регулярних виразів цих додатків?


Відповіді:


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"

Гарний! Будь-яка ідея менше? Це не працює менше. Я б хотів, щоб поведінка регулярного вираження була PCRE скрізь, але на жаль, це не так.
Грегг Левенталь

7
Також зверніть увагу на синтаксис для Negativ перегляду назад :\@<!
lanoxx

Це означає, що перед візерунком потрібно поставити негативний погляд позаду . Приклад: \(some\)\@<!thingвідповідатиме thingі everythingта nothing, але ні something.
dwanderson

7

(?!\.php)є оператором perge regexp. lessзазвичай використовується API POSIX regexp системи, тому зазвичай 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.