क्या किसी फ़ाइल में किसी शब्द की संख्या को गिनने का कोई तरीका है?


68

क्या यह संभव है कि किसी फ़ाइल में कोई शब्द या पैटर्न कितनी बार गिना जाए? यह कभी-कभी यह पता लगाने के लिए उपयोगी है कि किसी फ़ंक्शन को कितनी बार कॉल किया गया है, आदि।


जवाबों:


93

क्विंसी का उत्तर ठीक है, लेकिन ऐसा करने का एक सटीक तरीका है जिसे बफर को संपादित करने की आवश्यकता नहीं है:

:%s/pattern//ng

यह एक संदेश को प्रिंट करेगा 3 matches on 2 lines, और आपके बफर में कोई बदलाव नहीं किया जाएगा।

nझंडा बनाता :substituteआदेश बजाय मैचों की संख्या प्रिंट एक वास्तविक प्रतिस्थापन प्रदर्शन करने; gझंडा प्रत्येक पंक्ति में कई मैचों की रिपोर्टिंग सक्षम बनाता है।


एक अन्य चीज जो आपके उपयोग के मामले में उपयोगी हो सकती है वह है पैटर्न से मेल खाने वाली सभी पंक्तियों को प्रिंट करना:

:global/pattern/print

जिसे छोटा किया जा सकता है:

:g/pattern

यह :globalकमांड के सबसे सरल उपयोगों में से एक है (जो कि दिमाग से शक्तिशाली है)। यह बस मेल खाने वाली सभी लाइनों का प्रिंट आउट ले लेगा pattern, और फिर (यदि एक से अधिक लाइन है) तो आप इसे दबाने के Enterलिए दूसरी कमांड दबाएं या इसे हटा दें।

थोड़ा सा सामान्य ज्ञान: यह आदेश नाम की उत्पत्ति है grep, क्योंकि इसे आमतौर पर वर्णित किया जाएगा g/re/p, जहां re"नियमित अभिव्यक्ति" है।


2
+1 यह एक अच्छा जवाब है, ऑन-द-स्पॉट और यथोचित रूप से एक ही समय में विस्तृत। चलो उम्मीद करते हैं कि ज्यादातर सवालों के ऐसे जवाब मिले! :)
यो '

महान जवाब और अद्भुत सामान्य ज्ञान!
BiBi

मुझे साल में 2-3 बार ऐसा करना पड़ता है और सिंटैक्स को कभी याद नहीं रखना चाहिए ताकि यह हर बार सर्च मशीन में हो। बस इस स्पष्ट उत्तर के लिए धन्यवाद कहना चाहता था क्योंकि यह मेरे लिए एक से अधिक बार है और अब, कुछ वर्षों के लिए, मुझे उस भयानक विकिया पेज को बचाया है! (विकिया, नहीं पेज की सामग्री)
विल

1
माइनर बिट: कमांड g/re/pवास्तव में से है ed, नहीं vi। Grep कुछ वर्षों से vi की भविष्यवाणी करता है।
विल

मेरी एक nnoremap <leader>n :%s///gn<CR>मैपिंग है। इसलिए मैं <leader>nपहले खोजे गए पैटर्न की घटनाओं को गिनने के लिए दबाता हूं । मैं इसे आश्चर्यजनक रूप से अक्सर उपयोग करता हूं।
रॉल्फ

15

:%s/pattern//nnअंत में ध्वज बताता :sआदेश मैचों की संख्या रिपोर्ट करने के लिए और वास्तव में स्थानापन्न नहीं। :h :s_flagsअधिक जानकारी के लिए पढ़ें ।


4
है ना gn?
यो '

1
@yo 'हां, हालांकि जी सिर्फ एक और झंडा है, आप इसका उपयोग करना चाहते gहैं यदि आपको लगता है कि प्रति पंक्ति एक से अधिक मैच हो सकते हैं, जो अक्सर सच होता है। प्रश्न के उद्देश्य के लिए हालांकि ध्वज nअधिक महत्वपूर्ण है।
ध्रुव सागर

5

पहले /रेगेक्स की खोज करने के लिए उपयोग करें, फिर

:%s///gn

यह धुर्वा के उत्तर के समान है, सिवाय इसके कि यह।) उपयोग करने के लिए आसान है (क्योंकि आप अपने रेगेक्स के पहले मैच के परिणामों का पूर्वावलोकन कर सकते हैं) और बी।) सभी घटनाओं gको गिनने के लिए ध्वज के साथ विश्व स्तर पर मेल खाता है।


3

इस पीआर के लिए धन्यवाद https://github.com/vim/vim/pull/4317 , प्रत्येक खोज कमांड vim 8.1.1270 में खोज आँकड़े (जैसे वर्तमान मैच स्थिति, और मैचों की संख्या) दिखाता है। Sचर से निकालना सुनिश्चित करें shortmess


2

:%s/pattern//g

आपको स्टेटस बार में सबस्टीट्यूशन की संख्या दिखाई देगी। ऐसा कई बार patternदिखाई देता है। फिर बस uप्रतिस्थापन को पूर्ववत् करने के लिए दबाएँ ।


1

एक मैपिंग मैंने अपने .vimrc में यहां के उत्तरों के आधार पर जोड़ी:

" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>

" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>

स्पष्टीकरण की एक बिट, उम्मीद है कि नए vimmers के लिए उपयोगी:

  • <c-r><c-w> कमांड लाइन में कर्सर के नीचे शब्द सम्मिलित करता है, कई अवसरों में काम करता है।

  • <c-u>दूर करने के लिए स्वचालित रूप से डाले जरूरत है '<,'> जब दबाने :दृश्य मोड में और कमांड लाइन के लिए जा रहा। *रजिस्टर, (अंतिम) दृश्य चयन होता है <c-r>* की सामग्री को सम्मिलित करता है *(यह भी डालने मोड में इस्तेमाल किया जा सकता) कमांड लाइन में रजिस्टर।

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