स्ट्रिंग की खोज करें और vi संपादक में गणना करें


105

मैं एक स्ट्रिंग की खोज करना चाहता हूं और vi संपादक का उपयोग करके फ़ाइल में होने वाली घटनाओं की संख्या का पता लगाना चाहता हूं।


11
इस पृष्ठ पर चयनित उत्तर ( :g/xxxx/d) भयानक, खतरनाक और दूसरों से हीन है। कृपया इसे अचयनित करें।
ब्रूनो ब्रोंस्की

1
मैं सहमत हूँ और यह केवल आपको 'लाइन्स डिलीट' न होने वाली घटनाओं को 'डिलीट' करता है
user1709076

जवाबों:


4
:g/xxxx/d

यह पैटर्न के साथ सभी लाइनों को हटा देगा, और रिपोर्ट करेगा कि कितने हटाए गए हैं। उन्हें वापस पाने के लिए पूर्ववत करें।


6
बेशक, वह बस "d" को छोड़ सकता है, इसलिए उसे ऑपरेशन की आवश्यकता नहीं है।
Rook

15
ध्यान दें कि यह केवल आपको बताता है कि कितनी लाइनें हैं - न कि कितनी घटनाएं। मुझे लगता है कि डर्क एक बेहतर उपाय है।

4
नीचे दिया गया मेरा समाधान एक पंक्ति में कई घटनाओं को सही ढंग से गिनता है और पूर्ववत करने के लिए कुछ भी नहीं है।
मोहित चक्रवर्ती

6
बहुत खतरनाक: ओ
अंकित जलानी

1
यह स्वीकृत / सबसे लोकप्रिय उत्तर नहीं माना जाता है। एसओ मॉडरेटर क्या हैं? :(
user1412066


121

आपको nध्वज की आवश्यकता है । शब्दों के उपयोग की गणना करने के लिए:

:%s/\i\+/&/gn   

और एक विशेष शब्द:

:%s/the/&/gn        

count-itemsप्रलेखन अनुभाग देखें ।

यदि आप बस में टाइप करते हैं:

%s/pattern/pattern/g

तब स्टेटस लाइन आपको vi में मैचों की संख्या भी प्रदान करेगा।


ऐसा लगता है कि यह उत्तर विम उपयोगकर्ताओं के लिए है और वीआई के लिए नहीं है :(
kadeshpa

क्या आपके पास केवल आपके सिस्टम पर vi है? कौन सा संस्करण?
dirkgently

किसी ने आपके quesiton को विम के साथ टैग किया ... मैंने इसे हटा दिया।
ojblass

38

:% s / string / string / g उत्तर देगा।


क्या बेहतर जवाब है। +5 अगर संभव हो
ojblass

मुझे लगता है कि यह तभी काम करेगा जब कोई '। *' पैटर्न में उपयोग नहीं किया जाता है
AK

10
स्ट्रिंग को दोहराने की आवश्यकता नहीं है, बस करो %s/string//ng
SLM

23

(गुस्तावो ने कहा, लेकिन इसके अतिरिक्त:)

किसी भी पूर्व खोज के लिए, आप बस कर सकते हैं:

:%s///gn

एक पैटर्न की आवश्यकता नहीं है, क्योंकि यह पहले से ही खोज-रजिस्टर ( @/) में है।

"%" - s/पूरी फ़ाइल
"g" में करें - वैश्विक खोज करें (एक पंक्ति में कई हिट के साथ)
"n" - किसी भी प्रतिस्थापन को रोकता है s/- कुछ भी नहीं हटाया जाता है! कुछ भी नहीं पूर्ववत होना चाहिए!
(देखें: :help s_flagअधिक जानकारी के लिए)

(इस तरह, यह " नेत्रहीन चयनित पाठ के लिए खोज " के साथ पूरी तरह से काम करता है , जैसा कि विम-विकिया टिप 171 में वर्णित है )


3

उपयोग

:% S / पैटर्न / \ 0 / जी

जब पैटर्न स्ट्रिंग बहुत लंबा है और आप इसे फिर से टाइप करना पसंद नहीं करते हैं।


1

संक्षिप्त उत्तर :

:% S / स्ट्रिंग-टू-बी-खोजा गया // GN

सीखने के लिए :

नीचे के रूप में VI संपादक में 3 मोड हैं यहां छवि विवरण दर्ज करें

  • :आप से प्रवेश कर रहे हैं Commandकरने के लिए Command-lineमोड। अब आप जो कुछ भी लिखते हैं :वह CLI (कमांड लाइन इंटरफेस) पर है
  • %sसभी पंक्तियों को निर्दिष्ट करता है। रेंज को निर्दिष्ट करने का %मतलब है कि पूरी फ़ाइल में प्रतिस्थापन करें। सभी घटनाओं के लिए सिंटैक्स प्रतिस्थापन है:%s/old-text/new-text/g
  • gलाइन में सभी घटनाओं को निर्दिष्ट करता है। gध्वज के साथ , आप पूरी पंक्ति को प्रतिस्थापित कर सकते हैं। यदि इस gध्वज का उपयोग नहीं किया जाता है, तो लाइन में केवल पहली घटना को प्रतिस्थापित किया जाएगा।
  • n घटनाओं की आउटपुट संख्या को निर्दिष्ट करता है
  • //डबल स्लैश की चूक का प्रतिनिधित्व करता है replacement text। क्योंकि हम सिर्फ खोजना चाहते हैं।

एक बार घटनाओं की संख्या मिल जाने पर, आप Nएक-एक करके घटनाओं को देखने के लिए कुंजी दबा सकते हैं।

लाइन नंबर 1 से 10 की विशेष श्रेणी में खोजने और गिनने के लिए:

: 1,10s / हैलो // GN

  • कृपया ध्यान दें, %पूरी फाइल के लिए ,अलग लाइन नंबरों की प्रतिकृति है ।

लाइन नंबर 1 से 10 के विशेष रेंज में खोजने और बदलने के लिए:

: 1,10s / मेरा अनुरोध स्वीकार / हैलो / GN


0

मेरा सुझाव है:

  1. *कर्सर के नीचे क्या है के लिए या तो "बाउंडेड खोज" करें या एक मानक /patternखोज करें।
  2. :%s///gnघटनाओं की संख्या प्राप्त करने के लिए उपयोग करें । या आप :%s///nघटनाओं के साथ लाइनों की संख्या प्राप्त करने के लिए उपयोग कर सकते हैं ।

** मैं वास्तव में हर खोज के साथ " एन 1 एन पर एन 2 लाइनों" का संदेश देने वाला प्लग-इन ढूंढ सकता हूं , लेकिन अफसोस।

नोट: आउटपुट के मुश्किल शब्दों से भ्रमित मत हो। पूर्व कमान आपको कुछ दे सकती है जैसे 4 matches on 3 linesकि बाद वाला आपको दे सकता है 3 matches on 3 lines। जबकि तकनीकी रूप से सटीक, उत्तरार्द्ध भ्रामक है और इसे '3 लाइन मैच' कहना चाहिए। इसलिए, जैसा कि आप देख सकते हैं, वास्तव में बाद वाले ('एन' केवल) फॉर्म का उपयोग करने की कोई आवश्यकता नहीं है। आपको एक ही जानकारी मिलती है, और अधिक स्पष्ट रूप से, और 'gn' फ़ॉर्म का उपयोग करके।

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