2011-09-07 13 views
8

के साथ प्रतिस्थापित करें मेरे पास एक निश्चित स्ट्रिंग के साथ एक निश्चित पैटर्न को प्रतिस्थापित करने के लिए एक रेगेक्स है, लेकिन मैं इसे उससे अधिक गतिशील बनाना चाहता हूं।विम रेगेक्स एन अक्षरों

%s/hello/-----/g

मैं, हालांकि, इस के बजाय की तरह कुछ करना चाहते हैं:

%s/hello/-{5}/g

जिसका मतलब है कि 5 से नमस्ते की जगह

उदाहरण के लिए, मैं इस regex है कहना डैश।

क्या ऐसा करने का कोई तरीका है?

अंत में, मैं इस तरह कुछ करने के लिए करना चाहते हैं:

%s/(hello)*/-{\=strlen(\0)}/g

जो डैश जिसकी लंबाई मिलान किया स्ट्रिंग की लंबाई के बराबर है साथ ही hello रों के एक स्ट्रिंग के किसी भी मामले की जगह लेंगे ।

उत्तर

19
%s/\v(hello)*/\=repeat('-',strlen(submatch(0)))/g 
+0

काम करता है! धन्यवाद। क्या आप जानते हैं कि मैं सभी उपलब्ध फ़ंक्शंस कहां ढूंढ सकता हूं (जैसे स्ट्रेलन और दोहराना)? – tjameson

+3

': एच फ़ंक्शंस 'चाल –

+3

या' फ़ंक्शन-सूची 'करेगा। कभी-कभी यह अधिक आसान होता है। रिकर्सिव मैक्रो के लिए – sidyll

5

इसके बजाय विकल्प आदेश का उपयोग कर के, एक संपादन आदेशों के लिए प्रतिस्थापन प्रदर्शन स्वचालित कर सकते हैं। की ओवरराइटिंग घटनाओं का सबसे आसान तरीका हाथ से विशेष चरित्र वाले खोज पैटर्न निम्न है।

  1. अगली घटना की शुरुआत के लिए खोजें।

    /\(hello\)\+ 
    
  2. अंत तक मिलान करने वाला टेक्स्ट चुनें।

    v//e 
    
  3. चयनित टेक्स्ट को बदलें। कदम से

    r- 
    
  4. दोहराएँ 1.

तो, यह दिनचर्या रन कमांड

:let[@/,@s]=['\(hello\)\+',"//\rv//e\[email protected]"] 

को स्वचालित और के प्रारंभ से लेकर है कि s रजिस्टर की सामग्री को निष्पादित करने के लिए बफर (या अन्य उपयुक्त स्थान से):

[email protected] 
+0

+1 और '// e' का उपयोग करना –

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