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?

Gregg Leventhal
sumber
Untuk bagian mengapa, lihat Mengapa ekspresi reguler saya berfungsi di X tetapi tidak di Y?
Gilles 'SO- berhenti menjadi jahat'

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"
cuonglm
sumber
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).

Stéphane Chazelas
sumber
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