2016-08-29 6 views
5

कहें कि मेरे पास निम्न जैसे टेक्स्ट हैं।क्या विम में एन के साथ पैटर्न की एन-वें घटना को चिह्नित करना संभव है?

आदमी चल रहा है, और आदमी खा रहा है।

मैं इसे निम्नलिखित में बदलने के लिए प्रतिस्थापन का उपयोग कैसे करना चाहिए?

आदमी 1 चल रहा है, और आदमी 2 खा रहा है।

मैं जानता हूँ कि मैं :%s/\<man\>//gn उपयोग कर सकते हैं शब्द man की घटनाओं की संख्या की गणना करने के लिए और मैं /\%(\(pattern\).\{-}\)\{n - 1}\zs\1 पैटर्न के एन-वीं घटना पा सकते हैं पता है। लेकिन मैं एन-वें घटना को कैसे चिह्नित करूं?

किसी भी मदद की ईमानदारी से सराहना की जाती है; अग्रिम में धन्यवाद।

उत्तर

6

आपको एक गैर-शुद्ध कार्य करने की आवश्यकता होगी जो घटनाओं की गणना करता है, और उस कार्य के परिणाम का उपयोग करें।

" untested 
let s:count = 0 
function! Count() 
    let s:count += 1 
    return s:count 
endfunction 

:%s/man\zs/\=' '.Count()/ 
+1

बस एक छोटा सा अतिरिक्त। यदि आप इसे अपनी वीआईएम स्क्रिप्ट में नहीं जोड़ना चाहते हैं तो संभवतः आप वैश्विक चर का उपयोग करना चाहते हैं यानी 'जी: गिनती = 0' या कम से कम बफर वर्र्स:' बी: गिनती = 0'। वैरिएबल नेमस्पेस के बारे में आप ': आंतरिक-चर मदद करें' –

+0

माया में इसे ':% s/man \ zs \ ze/\ =' 'के रूप में संशोधित किया जाना चाहिए। गणना()/'। धन्यवाद, यह मेरे लिए बहुत मददगार है! – awllower

+1

@awllower। मैं वास्तव में '\ zs' का उपयोग करना चाहता था, लेकिन जल्दी में, मैंने दूसरे का इस्तेमाल किया। धन्यवाद! –

2

आप इसे मैक्रो के साथ कर सकते हैं। सबसे पहले, पैटर्न के लिए खोजें, जैसे /man /e

चलिए गिनती के लिए एक चर बनाते हैं, जैसे :let cnt=1

अब, a रजिस्टर को साफ़ करें।

qa दबाकर रिकॉर्डिंग प्रारंभ करें।

n दबाएं।

i दबाएं, फिर, Ctrl + R प्रकार = दबाएं। cnt टाइप करें। गिनती का मूल्य वहां डाला गया है। फिर, :let cnt=cnt+1 टाइप करें।

प्रेस एस्केप।

रजिस्टर को रोकने के लिए q दबाएं।

अब, घटनाओं की संख्या प्राप्त करने के लिए :%s/man //gn टाइप करें।

अब, आप अवसरों की संख्या जानते हैं, 10 कहें। फिर, आप [email protected] दबाएंगे। सभी घटनाओं को एक संख्या के साथ जोड़ा जाएगा, जो हर घटना के लिए बढ़ाया जाता है।

+1

इस आश्चर्यजनक सरल मैक्रो दृष्टिकोण के लिए धन्यवाद। – awllower

संबंधित मुद्दे