2013-11-15 8 views
172

मैं वर्तमान में प्रतिस्थापित करने के लिए :%s/<search_string>/<replace_string>/g फ़ाइल में स्ट्रिंग को बदलने के लिए :s/<search_string>/<replace_string>/ कर सकता हूं।एकाधिक लाइनों पर विम में तारों को ढूंढें और बदलें

मैं विम में चुनिंदा रेखाओं से शब्दों का चयन और प्रतिस्थापित कैसे कर सकता हूं?

उदाहरण: 6-10, 14-18 से टेक्स्ट को प्रतिस्थापित करें लेकिन 11-13 से नहीं।

+1

यह भी देखें [vim कई गैर अनुक्रमिक रेखाओं को एक बार में चुनें/संपादित करें] (http://stackoverflow.com/q/16439297)। – glts

+0

http://vim.wikia.com/wiki/Search_and_replace – MrRolling

उत्तर

140

:&& कमांड एक ही झंडे के साथ अंतिम प्रतिस्थापन दोहराता है।(के रूप में आप की तरह और श्रेणीबद्ध रूप में कई) आप इसे करने के लिए अतिरिक्त सीमा (ओं) की आपूर्ति कर सकते हैं:

:6,10s/<search_string>/<replace_string>/g | 14,18&& 

आप कई पर्वतमाला है, तो हालांकि, मैं नहीं बल्कि एक पाश का उपयोग करेंगे:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor 
+32

+1 मैं भी परेशान क्यों करता हूं ... –

+1

धन्यवाद। भविष्य के उपयोगकर्ताओं के लिए नोट - ': 6,10s///g | : 14,18 && | : 20,23 और& | : 28,31 && 'भी काम करेगा,' लूप 'को याद रखना और निष्पादित करना अधिक आसान बनाता है। –

+2

खुशी है कि आप इसे पसंद करते हैं! बाद के आदेशों पर ':' वैकल्पिक है, बीटीडब्ल्यू, ताकि आप कुछ और कीस्ट्रोक बचा सकें। –

26

आप दो खोज के साथ यह कर सकते हैं/दृश्यों

:6,10s/<search_string>/<replace_string>/g 
    :14,18s/<search_string>/<replace_string>/g 

दूसरी बार तुम सब समायोजित करने की आवश्यकता यह सब पूरा लिखने की तो बजाय रेंज है की जगह, मैं पिछले आदेश और संपादित बस याद होगा सीमा

151

सभी बदलें:

:%s/foo/bar/g 

'foo' (सभी पंक्तियों में) में से प्रत्येक घटना का पता लगाएं, और 'बार' से बदल दें।

विशिष्ट लाइनों के लिए:

:6,10s/foo/bar/g 

बदलें लाइन 10 समावेशी करने के लिए लाइन 6 से सभी लाइनों के लिए 'बार' के लिए प्रत्येक 'foo'।

+0

और लाइन 14-18 के बारे में क्या? – Bernhard

+0

आपको एक ही आदेश का फिर से उपयोग करना होगा। विम याद करते हैं जैसे @ लिवन ​​द्वारा धन्यवाद .. धन्यवाद। –

+0

यहां/जी का उद्देश्य क्या है? क्षमा करें मैं लिनक्स –

34

एक तरफ ध्यान दें के रूप में, बजाय लाइन संख्या में टाइप करने के लिए, बस लाइनों जहां आप ढूंढना चाहते हैं पर प्रकाश डाला होने के/दृश्य साधनों में से एक में बदल देते हैं:

  • VISUAL मोड (वी)
  • VISUAL BLOCK मोड (Ctrl + वी)
  • VISUAL LINE मोड (शिफ्ट + वी, आपके मामले में सबसे अच्छा काम करता है)

एक बार जब आप प्रतिस्थापित करने के लिए लाइनों का चयन कर लेते हैं, तो ty अपने आदेश PE:

:s/<search_string>/<replace_string>/g 

आप ध्यान दें हूँ कि सीमा '<,'> आप के लिए स्वचालित रूप से सम्मिलित किया जाएगा:

:'<,'>s/<search_string>/<replace_string>/g 

यहाँ '< सीधा सा अर्थ पहली पंक्ति पर प्रकाश डाला, और '> मतलब है पिछले प्रकाश डाला लाइन

ध्यान दें कि व्यवहार अप्रत्याशित हो सकता है NORMAL मोड में जब: '< और आरंभ और पिछले उजागर VISUAL विधियों में से एक में किया के अंत तक '> बिंदु। इसके बजाय, NORMAL मोड, विशेष लाइन संख्या . का उपयोग किया जा सकता है, जिसका अर्थ केवल वर्तमान पंक्ति है। इसलिए, आप पा सकते हैं/केवल इस तरह मौजूदा लाइन पर बदल देते हैं:

:.s/<search_string>/<replace_string>/g 

नोट करने के लिए एक और बात यह है कि एक दूसरे : रेंज और ढूंढें बीच डालने/कमांड करता है कोई नुकसान नहीं, दूसरे शब्दों में, इन की जगह है आदेशों अभी भी काम करेगा:

:'<,'>:s/<search_string>/<replace_string>/g 
:.:s/<search_string>/<replace_string>/g 
+0

> उदाहरण: पंक्तियों को 6-10, 14-18 से बदलें लेकिन 11-13 से नहीं। - क्या आपका उत्तर इस सवाल का उत्तर नहीं देता है, है ना? – poige

-3
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 
/sys/sim/source/gm/kg/jl/ls/owow/lsal 

मान लीजिए आप किसी अन्य जानकारी के साथ ऊपर बदलना चाहते हैं।

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

इस में ऊपर (sys.pkg.mpu.umc.kdk.) के साथ बदल दिया हो जाएगी।

+0

मुझे यकीन नहीं है कि यह वास्तव में प्रश्न का उत्तर देता है। प्रश्न से ऐसा लगता है कि पूछने वाले व्यक्ति को इनपुट को संशोधित करने के लिए पहले से ही '% s' का उपयोग करने के बारे में पता है, लेकिन यह जानना चाहता है कि इसे "अर्ध-वैश्विक रूप से" कैसे करना है (यानी उसका विनिर्देश रेखा 6-10 और 14-18 है लेकिन नहीं लाइनों पर 11-13)। –

+1

इसके अलावा "कमांड" क्या है? और आप [दुबला टूथपिक सिंड्रोम] से पीड़ित हैं (https://en.wikipedia.org/wiki/Leaning_toothpick_syndrome)। – Carpetsmoker

+0

उस सिंड्रोम को ठीक करने के लिए, आप किसी अन्य वर्ण को डिफ़ॉल्ट '/' के बजाय डेलीमीटर के रूप में उपयोग कर सकते हैं, उदा। '!', '@', '_':':% s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g' – MortezaE

9

छठी खोज और की जगह आदेश उदाहरण

हम कहते हैं कि आप एक शब्द "foo" कहा जाता है खोजने के लिए और "बार" के साथ बदलने के लिए चाहते हैं।

पहले हिट [Esc] कुंजी

प्रकार: (कोलन)% s/foo/बार के बाद/और हिट कुंजी [Enter]। :% s/foo/bar/

+4

आपका '% s///g' कमांड पूरी फ़ाइल में सभी घटनाओं को प्रतिस्थापित करेगा। वास्तव में सवाल का जवाब नहीं है, लेकिन फिर भी उपयोगी :) – tanius

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