Asserzioni lookbehind / ahead negative in Linux less pager (o vim)


14

Voglio trovare tutte le istanze di "indice" non seguite da .php in un registro usando less. /index(?!\.php)non funziona. È possibile? Qual è la regex per less e vim (differiscono?). Questo non è possibile con le rispettive librerie regex di queste applicazioni?


Risposte:


22

In vim, puoi fare così:

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

Per maggiori dettagli, in modalità comando, prova :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"

Bellissimo! Qualche idea per meno? Questo non funziona in meno. Vorrei che il comportamento regex fosse PCRE ovunque, ma purtroppo non lo è.
Gregg Leventhal,

7
Nota anche la sintassi per il look negativ :\@<!
lanoxx

Va da sé che devi mettere lo sguardo negativo dietro lo schema. Un esempio: \(some\)\@<!thingcorrisponderàthing e everythinge nothing, ma non something.
Dwanderson,

7

(?!\.php)è un operatore perge regexp. lessgeneralmente usa l'API regexp POSIX del sistema, quindi in genere GNU ha esteso le espressioni regolari su un sistema GNU, vimusa vimespressioni regolari.

In vim, come già mostrato da cuonglm, l'equivalente di index(?!\.php)sarebbe index\(\.php\)\@!o \vindex(\.php)@!.

Per less, al momento della compilazione, è possibile scegliere la libreria / API regex e di conseguenza il tipo regex da utilizzare:

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

Per impostazione predefinita, tuttavia, lessutilizzerà POSIX regcompcon REG_EXTENDED, quindi otterrai le espressioni regolari estese del tuo sistema, quindi in genere qualcosa di simile a con grep -E.

In GNU regexp esteso, non esiste un operatore equivalente per guardare indietro o guardare avanti.

Potresti farlo nel modo più duro:

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

Con less, è possibile utilizzare il &tasto per filtrare le righe contenenti index.php(&!index\.php ), quindi cercare index( /index). (ti mancheranno comunque le altre istanze indexche compaiono su una riga che contiene anche index.php).


1
Penso che la libreria regex che lessutilizza dipende dal tempo di compilazione.
cuonglm,

@Gnouc, hai ragione, sembra che ora supporti anche PCRE.
Stéphane Chazelas,

Sì, possiamo verificare se lessutilizza PCREanalizzando l'output di ldd $(which less). Ma con un'altra libreria, conosci un modo per controllare?
cuonglm,

1
@Gnouc, stampa il nome della libreria regex con less --version.
Stéphane Chazelas,

Uso Ubuntu 12.04 LTS e con less --verion, stampa solo less 444insieme al Copyright.
cuonglm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.