2010-06-23 14 views
19

में पहली गैर-मिलान वाली रेखा खोजें कभी-कभी ऐसा होता है कि मुझे विंडोज़ पर विभिन्न लॉग और ट्रेस फाइलों को देखना होगा और आम तौर पर मैं उद्देश्य वीआईएम के लिए उपयोग करता हूं। एक पंक्ति बफ़र नहीं मिलान दिया नियमित अभिव्यक्ति में मिल:वीआईएम

मेरे समस्या यह है कि मैं अभी भी नहीं किसी भी अनुरूप grep -v की विम के अंदर मिल सकती है। जैसे लॉग फ़ाइल उन रेखाओं से भरी हुई है जो किसी बीच में कहीं भी all is ok वाक्यांश हैं और मुझे पहली पंक्ति ढूंढनी होगी जिसमें all is ok नहीं है।

मैं इसके लिए एक कस्टम फ़ंक्शन लिख सकता हूं, फिर भी इस समय एक ओवरकिल लगता है और मूल समाधान की तुलना में धीमी होने की संभावना है।

क्या वीआईएम में ऐसा करने का कोई आसान तरीका है?

:%g!/search/p 

यह बाहर मुद्रित करने के लिए कहते हैं गैर मिलान लाइनों ... यकीन नहीं करता है, तो यह है कि काम किया, लेकिन यह के साथ खत्म किया:

उत्तर

13

आप नकारात्मक लुक-पीछे ऑपरेटर @<!

उदा उपयोग कर सकते हैं ("खोज", निश्चित रूप से के लिए कुछ अन्य स्ट्रिंग स्थानापन्न) , सभी नहीं लाइनों "एक" युक्त खोजने के लिए का उपयोग /\v^.+(^.*a.*$)@<!$

(\v बस का कारण बनता है ( और @<! की तरह कुछ ऑपरेटरों नहीं किया गया है करने के लिए करना चाहिए है बैकस्लैश भाग निकले)

सरल तरीका मिलान सभी लाइनों या मिलान नहीं हटाना है पैटर्न (:g/PATTERN/d या :g!/PATTERN/d क्रमशः)

+0

'/^.\+\(^.*all ठीक है। * $ \) \ @ Dummy00001

+0

': जी!/पैटरन/पी 'बहुत अधिक उत्पादन पैदा करता है। कुछ एमएलएन लाइन फ़ाइल के लिए जो एक विकल्प नहीं है। लेकिन ': g!/Pattern/d' बहुत उपयोगी दिखता है उदा। stdin से पढ़ने वाले बफर के साथ काम करने के लिए, अभी तक एक फ़ाइल में सहेजा नहीं गया है। – Dummy00001

+0

उम ... जाहिर है कि मेरे मामले के लिए ': g!/Pattern/d' (बिना छेड़छाड़ की लाइनों को अनदेखा करने वाली रेखाओं को अनदेखा करें) को 'g/Pattern/d'' के रूप में लिखा जाना चाहिए! - अनिच्छुक लाइनों को हटाने के लिए। – Dummy00001

2

मैं सिर्फ कुछ हद तक एक klutzy प्रक्रिया "जी" आदेश का उपयोग कामयाब पहली गैर-मिलान रेखा पर स्थित कर्सर।

+2

और ': v' निश्चित रूप से ': g!' के पर्याय का है। – Cascabel

+0

@ जेफ्रोमी: इसके लिए धन्यवाद, मैं ': v' के बारे में भूल गया था। –

5

मैं अपने मामले में अक्सर हूँ, "क्लीन" लॉग फ़ाइलों के लिए तो मैं का उपयोग करें:

:g/all is ok/d 

आपका grep -v

:v/error/d 

कौन सा सभी लाइनों जो करता नहींत्रुटि शामिल निकाल देंगे के साथ प्राप्त किया जा सकता है।

19

मेरा मानना ​​है कि यदि आप बस अपने कर्सर को पहली गैर-मिलान रेखा पर समाप्त करना चाहते हैं तो आप अपने वैश्विक कमांड में कमांड के रूप में दृश्य का उपयोग कर सकते हैं। तो:

:v/pattern/visual 

आपके कर्सर को पहली गैर-मेलिंग लाइन पर छोड़ देगा। या:

:g/pattern/visual 

आपके कर्सर को पहली मिलान रेखा पर छोड़ देगा।

+1

विज़ुअल कमांड को भी vi को छोटा किया जा सकता है ... ताकि आप यह कर सकें: v/pattern/vi –

+0

यह स्पष्ट रूप से सबसे अच्छा जवाब है। यह क्यों नहीं चुना गया था !? – histumness

+3

यह फ़ाइल की शुरुआत से शुरू होने वाली पहली गैर-मिलान वाली रेखा पाती है, लेकिन वर्तमान कर्सर स्थिति से शुरू नहीं होती है। कर्सर स्थिति से खोज के लिए ':।, $ V/pattern/vi' का उपयोग करें। –

3

शायद यह बहुत देर हो चुकी है, लेकिन मुझे लगता है कि यह कहीं कहीं कहा जाना चाहिए।

विम (संस्करण 7 के बाद से।4) नामक प्लगइन के साथ आता है LogiPat, जो उन रेखाओं की खोज करता है जिनमें कुछ स्ट्रिंग वास्तव में आसान नहीं होती है। तो नहीं all is ok युक्त इस तरह से किया जाता है लाइनों की खोज इस प्लगइन का उपयोग कर:

:LogiPat !"all is ok" 

और फिर आप (इस मामले से मेल नहीं खाने में या) n और N साथ लाइनों मिलान बीच जा सकते हैं।

तुम भी एक पैटर्न में विभिन्न तार जुड़ने के लिए & और | तरह तार्किक आपरेशनों का उपयोग कर सकते हैं:

:LP !("foo"|"bar")&"baz" 

LPLogiPat के लिए आशुलिपि है, और इस कमांड लाइन है कि शब्द baz और डॉन 'को शामिल के लिए खोज करेंगे टी में न तो foo और न ही bar शामिल हैं।