Linux'ta daha az çağrı cihazı (veya vim) içeren negatif ileri / geri savlar


14

Ben kullanarak bir günlükte .php izlemiyor "dizin" tüm örnekleri bulmak istiyorum less. /index(?!\.php)çalışmıyor. Mümkün mü? Daha az ve vim için regex nedir (farklılar mı?). Bu uygulamanın ilgili regex kütüphaneleri ile bu mümkün değil mi?


Yanıtlar:


22

İçinde vim, bunu yapabilirsiniz:

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

Daha fazla ayrıntı için komut modunda :h \@şunları deneyin :

\@!     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"

Güzel! Daha azı için bir fikrin var mı? Bu daha az işe yaramaz. Regex davranış PCRE her yerde keşke, ama ne yazık ki değil.
Gregg Leventhal

7
Ayrıca negativ\@<!
lookbehind

Bu negatif görünüm koymak gerektiğini söyleyerek gider arkasında desen önce. Bir örnek: \(some\)\@<!thingEşleşir thingve everythingve eşleşir nothing, ancak eşleşmez something.
dwanderson

7

(?!\.php)perl regexp operatörüdür. lessgenellikle sistemin POSIX normal ifade API'sini kullanır, bu nedenle genellikle GNU bir GNU sisteminde düzenli ifadeler vimkullanır, vimnormal ifadeler kullanır .

Olarak vimönceden cuonglm ile gösterildiği gibi, eşdeğer index(?!\.php)olur index\(\.php\)\@!ya da \vindex(\.php)@!.

İçin less, derleme zamanda, düzenli ifade kütüphanesi / API seçebilir ve sonucunda kullanımına regex tipi olarak:

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

Varsayılan olarak, gerçi lessPOSIX kullanacak regcompbunu tipik olduğu gibi benzer bir şey sisteminizin genişletilmiş düzenli ifadeler alırsınız, REG_EXTENDED ile grep -E.

GNU genişletilmiş normal ifadesinde, operatörün arkasına ya da ileriye bakacak bir eşdeğer yoktur.

Zor yoldan yapabilirsin:

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

Tuşuyla less, ( ) &içeren satırları filtrelemek ve ardından ( ) öğesini aramak için tuşu kullanabilirsiniz . (yine de içeren bir satırda görünen diğer örneklerini özlersiniz ).index.php&!index\.phpindex/indexindexindex.php


1
Bence hangi regex kütüphanesi lesskullanan derlenmiş zaman bağlıdır.
cuonglm

@Gnouc, haklısın, şimdi bile PCRE'yi destekliyor gibi görünüyor.
Stéphane Chazelas

Evet, çıktılarını ayrıştırarak lesskullanım olup olmadığını kontrol edebiliriz . Ancak diğer kütüphanelerle kontrol etmenin bir yolunu biliyor musunuz? PCREldd $(which less)
cuonglm

1
@Gnouc, normal ifade kitaplığının adını yazdırır less --version.
Stéphane Chazelas

Ubuntu 12.04 LTS kullanıyorum ve less --verionsadece less 444Telif Hakkı ile birlikte yazdırılıyor .
cuonglm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.