Asserções lookbehind / ahead negativas no paginador do Linux less (ou vim)

14

Eu quero encontrar todas as instâncias de "index" não seguidas por .php em um log usando less . /index(?!\.php) não funciona. Isso é possível? Qual é o regex para menos e vim (eles diferem?). Isso não é possível com as respectivas bibliotecas de regex dessas aplicações?

    
por Gregg Leventhal 04.05.2014 / 18:27

2 respostas

22

Em vim , você pode fazer assim:

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

Para mais detalhes, no modo de comando, tente :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"
    
por 04.05.2014 / 18:53
7

(?!\.php) é um operador perl regexp. less geralmente usa a API regexp POSIX do sistema, então expressões regulares estendidas normalmente no GNU em um sistema GNU, vim usa vim expressões regulares.

Em vim , como já mostrado por cuonglm, o equivalente a index(?!\.php) seria index\(\.php\)\@! ou \vindex(\.php)@! .

Para less , em tempo de compilação, você pode escolher a biblioteca / API regex e, como resultado, o tipo de regex a ser usado:

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

Por padrão, less usará POSIX regcomp com REG_EXTENDED, portanto, você obterá as expressões regulares estendidas de seu sistema, então normalmente algo semelhante com grep -E .

Na regexp estendida do GNU, não há um look equivalente por trás ou um operador do futuro.

Você pode fazer isso da maneira mais difícil:

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

Com less , você pode usar a tecla & para filtrar as linhas que contêm index.php ( &!index\.php ) e, em seguida, pesquisar por index ( /index ). (você ainda perderia as outras instâncias de index que aparecem em uma linha que também contém index.php ).

    
por 04.05.2014 / 19:20