Negative Lookbehind / Ahead-Behauptungen in Linux ohne Pager (oder Vim)

14

Ich möchte alle Instanzen von "index", nicht gefolgt von .php, in einem Protokoll mit finden less. /index(?!\.php)funktioniert nicht. Ist das möglich? Was ist der reguläre Ausdruck für weniger und vim (unterscheiden sie sich?). Ist dies mit den jeweiligen Regex-Bibliotheken dieser Anwendung nicht möglich?

Gregg Leventhal
quelle
Weitere Informationen zum Warum finden
Gilles 'SO - hör auf, böse zu sein',

Antworten:

22

In vimkönnen Sie dies tun:

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

Versuchen Sie für weitere Informationen im Befehlsmodus Folgendes :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"
cuonglm
quelle
Schön! Irgendeine Idee für weniger? In weniger geht das nicht. Ich wünschte, Regex-Verhalten wäre überall PCRE, aber leider nicht.
Gregg Leventhal
7
Beachten Sie auch die Syntax für Negativ Lookbehind :\@<!
Lanoxx
Es geht zu sagen , dass Sie den negativen Blick setzen müssen hinter vor dem Muster. Ein Beispiel: \(some\)\@<!thingWird mit thingund everythingund übereinstimmen nothing, aber nicht something.
Dwanderson
7

(?!\.php)ist ein Perl-Regexp-Operator. lessverwendet in der Regel, POSIX regexp API des Systems so typisch GNU erweiterte reguläre Ausdrücke auf einem GNU - System, vimverwendet vimreguläre Ausdrücke.

In vim, wie bereits durch cuonglm gezeigt, das äquivalent index(?!\.php)wäre index\(\.php\)\@!oder \vindex(\.php)@!.

Zum lessZeitpunkt der Kompilierung können Sie die Regex-Bibliothek / API und als Ergebnis den zu verwendenden Regex-Typ auswählen:

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

Standardmäßig lesswird jedoch POSIX regcompmit REG_EXTENDED verwendet, sodass Sie die erweiterten regulären Ausdrücke Ihres Systems erhalten, also normalerweise etwas Ähnliches wie mit grep -E.

In GNU Extended Regexp gibt es keinen vergleichbaren Look-Behind- oder Look-Ahead-Operator.

Sie könnten es auf die harte Tour machen:

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

Mit lesskönnten Sie möglicherweise die &Taste verwenden, um die Zeilen herauszufiltern, die index.php( &!index\.php) enthalten, und dann nach index( /index) zu suchen . (Sie würden immer noch die anderen Instanzen vermissen index, die in einer Zeile mit enthalten sind index.php).

Stéphane Chazelas
quelle
1
Ich denke, welche Regex-Bibliothek, die lessverwendet wird, von der kompilierten Zeit abhängt.
4.
@ Gnouc, du hast recht, es unterstützt PCRE, wie es scheint.
Stéphane Chazelas
Ja, wir können überprüfen, ob sie lessverwendet werden, PCREindem wir die Ausgabe von analysieren ldd $(which less). Aber wissen Sie bei einer anderen Bibliothek, wie Sie das überprüfen können?
5.
1
@Gnouc, gibt den Namen der Regex-Bibliothek mit aus less --version.
Stéphane Chazelas
Ich benutze Ubuntu 12.04 LTS und mit less --verion, druckt es nur less 444zusammen mit Copyright.
5.