Vim
Linux 少分頁器(或 vim)中的負後瞻/前瞻斷言
我想在使用 .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
)。