Assertions de lookbehind / ahead négatives dans Linux sans pager (ou vim)


14

Je veux trouver toutes les instances de "index" non suivies de .php dans un journal utilisant less. /index(?!\.php)ne marche pas. Est-ce possible? Quel est le regex pour less et vim (sont-ils différents?). N'est-ce pas possible avec les bibliothèques regex respectives de ces applications?


Réponses:


22

Dans vim, vous pouvez faire comme ceci:

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

Pour plus de détails, en mode commande, essayez :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"

Magnifique! Une idée pour moins? Cela ne fonctionne pas en moins. Je souhaite que le comportement des regex soit PCRE partout, mais hélas ce n'est pas le cas.
Gregg Leventhal

7
Notez également la syntaxe pour negativ lookbehind :\@<!
lanoxx

Il va de soi que vous devez mettre le regard négatif derrière le motif. Un exemple: \(some\)\@<!thingcorrespondra à thinget everythinget nothing, mais pas something.
dwanderson

7

(?!\.php)est un opérateur perge regexp. lessutilise généralement l'API regexp POSIX du système, donc généralement les expressions régulières étendues GNU sur un système GNU, vimutilisent vimdes expressions régulières.

Dans vim, comme l'a déjà montré cuonglm, l'équivalent de index(?!\.php)serait index\(\.php\)\@!ou\vindex(\.php)@! .

Pour less, au moment de la compilation, vous pouvez choisir la bibliothèque / API regex et par conséquent le type regex à utiliser:

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

Par défaut, cependant, lessutilise POSIX regcompavec REG_EXTENDED, vous obtiendrez donc les expressions régulières étendues de votre système, donc généralement quelque chose de similaire à celui degrep -E .

Dans l'expression rationnelle étendue GNU, il n'y a pas d'opérateur de recherche arrière ou d'anticipation équivalent.

Vous pouvez le faire à la dure:

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

Avec less, vous pouvez éventuellement utiliser la &clé pour filtrer les lignes contenant index.php( &!index\.php), puis rechercher index( /index). (vous manqueriez encore les autres instances indexqui apparaissent sur une ligne contenant également index.php).


1
Je pense que la bibliothèque regex qui lessutilise dépend du temps compilé.
cuonglm

@Gnouc, vous avez raison, il prend même en charge PCRE, semble-t-il.
Stéphane Chazelas

Oui, nous pouvons vérifier si les lessutilisations PCREen analysant la sortie de ldd $(which less). Mais avec une autre bibliothèque, connaissez-vous un moyen de vérifier?
cuonglm

1
@Gnouc, il imprime le nom de la librairie regex avec less --version.
Stéphane Chazelas

J'utilise Ubuntu 12.04 LTS et avec less --verion, il imprime uniquement less 444avec Copyright.
cuonglm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.