Pandangan negatif di belakang / pernyataan di depan di Linux kurang pager (atau vim)


14

Saya ingin menemukan semua contoh "indeks" tidak diikuti oleh .php di log menggunakan less. /index(?!\.php)tidak bekerja. Apakah ini mungkin? Apa regex kurang dan vim (apakah mereka berbeda?). Apakah ini tidak mungkin dengan perpustakaan regex masing-masing aplikasi ini?


Jawaban:


22

Di vim, Anda bisa melakukan ini:

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

Untuk detail lebih lanjut, dalam mode perintah, coba :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"

Cantik! Ada ide untuk kurang? Ini tidak bekerja dalam waktu kurang. Saya berharap perilaku regex adalah PCRE di mana-mana, tetapi sayangnya tidak.
Gregg Leventhal

7
Perhatikan juga sintaks untuk tampilan negativ di belakang :\@<!
lanoxx

Bunyinya dengan mengatakan bahwa Anda perlu menempatkan pandangan negatif di belakang sebelum pola. Contoh: \(some\)\@<!thingAkan cocok thingdan everythingdan nothing, tetapi tidak something.
dwanderson

7

(?!\.php)adalah operator perl regexp. lessumumnya menggunakan POSIX regexp API sistem, jadi biasanya GNU memperluas ekspresi reguler pada sistem GNU, vimmenggunakan vimekspresi reguler.

Dalam vim, seperti yang sudah ditunjukkan oleh cuonglm, padanannya index(?!\.php)adalah index\(\.php\)\@!atau \vindex(\.php)@!.

Sebab less, pada waktu kompilasi, Anda dapat memilih regex library / API dan sebagai hasilnya tipe regex untuk digunakan:

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

Secara default, lessakan menggunakan POSIX regcompdengan REG_EXTENDED, jadi Anda akan mendapatkan ekspresi reguler yang diperluas dari sistem Anda, jadi biasanya mirip dengan grep -E.

Dalam GNU extended regexp, tidak ada tampilan yang sepadan di belakang atau melihat ke depan operator.

Anda bisa melakukannya dengan cara yang sulit:

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

Dengan less, Anda mungkin dapat menggunakan &kunci untuk memfilter baris yang berisi index.php( &!index\.php), dan kemudian mencari index( /index). (Anda masih akan melewatkan contoh lain indexyang muncul pada baris yang juga berisi index.php).


1
Saya pikir apa perpustakaan regex yang lessdigunakan tergantung pada waktu yang dikompilasi.
cuonglm

@ Gnouc, Anda benar, bahkan sekarang mendukung PCRE tampaknya.
Stéphane Chazelas

Ya, kami dapat memeriksa apakah lesspenggunaan PCREdengan menguraikan output dari ldd $(which less). Tetapi dengan perpustakaan lain, apakah Anda tahu cara untuk memeriksanya?
cuonglm

1
@ Gnouc, itu mencetak nama perpustakaan regex dengan less --version.
Stéphane Chazelas

Saya menggunakan Ubuntu 12,04 LTS dan dengan less --verion, hanya mencetak less 444bersama dengan Hak Cipta.
cuonglm
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.