Vim

Linux 少分頁器(或 vim)中的負後瞻/前瞻斷言

  • February 22, 2016

我想在使用 .php 的日誌中查找所有未跟隨 .php 的“索引”實例less/index(?!\.php)不起作用。這可能嗎?less 和 vim 的正則表達式是什麼(它們有什麼不同嗎?)。這些應用程序各自的正則表達式庫不可能嗎?

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"

(?!\.php)是一個 perl 正則表達式運算符。less通常使用系統的 POSIX regexp API,因此通常 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將使用 POSIXregcomp和 REG_EXTENDED,因此您將獲得系統的擴展正則表達式,因此通常與grep -E.

在 GNU 擴展正則表達式中,沒有等效的向後看或向前看運算符。

您可以通過艱難的方式做到這一點:

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

使用less,您可以使用該&鍵過濾掉包含index.php( &!index\.php) 的行,然後搜尋index( /index)。(您仍然會錯過index出現在也包含 的行上的其他實例index.php)。

引用自:https://unix.stackexchange.com/questions/127818