लिनक्स कम पेजर (या विम) में नकारात्मक खोज / आगे के दावे


14

मैं "इंडेक्स" के सभी उदाहरणों को खोजना चाहता हूं जिनका उपयोग करके लॉग में .php का पालन नहीं किया जाता है less/index(?!\.php)काम नहीं करता। क्या यह संभव है? कम और विम के लिए रेगीक्स क्या है (क्या वे अलग हैं?)। क्या यह इन एप्लिकेशन के संबंधित रेगेक्स पुस्तकालयों के साथ संभव नहीं है?


जवाबों:


22

में vim, आप इस तरह कर सकते हैं:

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

अधिक जानकारी के लिए, कमांड मोड में कोशिश करें :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"

सुंदर! कम के लिए कोई विचार? यह कम में काम नहीं करता है। काश रेगेक्स व्यवहार पीसीआरई हर जगह होता, लेकिन अफसोस ऐसा नहीं है।
ग्रेग लेवेंटल

7
नेगटिव लुकहाइंड के लिए सिंटैक्स पर भी ध्यान दें :\@<!
लैनोक्स

यह कहने के साथ जाता है कि आपको पैटर्न से पहले नकारात्मक रूप को पीछे रखना होगा । एक उदाहरण: \(some\)\@<!thingसे मेल खाएगा thingऔर everythingऔर nothingनहीं, बल्कि something
dwanderson 21

7

(?!\.php) एक perl regexp ऑपरेटर है। lessआमतौर पर सिस्टम POSIX regexp API का उपयोग करता है, इसलिए आमतौर पर GNU एक GNU सिस्टम पर नियमित एक्सप्रेशन बढ़ाता है, नियमित एक्सप्रेशन vimका उपयोग करता है vim

में vim, जैसा कि पहले से ही cuonglm द्वारा दिखाया गया है, के बराबर index(?!\.php)होगाindex\(\.php\)\@! या \vindex(\.php)@!

के लिए less, संकलन समय पर, आप regex पुस्तकालय / एपीआई चयन कर सकते हैं और एक परिणाम के उपयोग करने के लिए regex प्रकार के रूप में:

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

हालांकि डिफ़ॉल्ट रूप से, lessPOSIX का उपयोग करेगाregcomp REG_EXTENDED के साथ किया जाएगा, इसलिए आपको अपने सिस्टम के विस्तारित नियमित भाव मिलेंगे, इसलिए आमतौर पर ऐसा ही कुछ होता है grep -E

GNU विस्तारित रेगेक्स में, पीछे कोई समान रूप नहीं है या आगे ऑपरेटर नहीं दिखता है।

आप इसे कठिन तरीके से कर सकते हैं:

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

इसके साथ less, आप संभवतया &कुंजी युक्त index.php( &!index\.php) को फ़िल्टर करने के लिए कुंजी का उपयोग कर सकते हैं , और फिर खोज सकते हैं index( /index)। (आप अभी भी उस के अन्य उदाहरणों को याद indexकरेंगे जिसमें एक पंक्ति भी दिखाई देती है index.php)।


1
मुझे लगता है कि जो रेक्सक्स लाइब्रेरी का lessउपयोग करता है वह संकलित समय पर निर्भर है।
cuonglm

@Gnouc, आप सही कह रहे हैं, यह अब भी लगता है कि PCRE का समर्थन करता है।
स्टीफन चेज़लस

हाँ, हम जाँच कर सकते हैं कि क्या पार्सिंग आउटपुट का lessउपयोग करता PCREहै ldd $(which less)। लेकिन अन्य पुस्तकालय के साथ, क्या आप जांचने का कोई तरीका जानते हैं?
कोउंगलम

1
@ Gnouc, यह regex लाइब्रेरी के नाम को प्रिंट करता है less --version
स्टीफन चेजलस

मैं Ubuntu 12.04 LTS का उपयोग करता हूं और less --verionयह less 444कॉपीराइट के साथ ही प्रिंट करता है ।
कोउंगलम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.