कई लाइनों पर vim में स्ट्रिंग्स को ढूंढें और बदलें


354

मैं :%s/<search_string>/<replace_string>/gएक स्ट्रिंग को फाइल :s/<search_string>/<replace_string>/में बदलने के लिए , या करंट लाइन में बदलने के लिए कर सकता हूं ।

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

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



जवाबों:


255

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

: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

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

5
खुश हूँ कि आपने इसे पसंद किया! :बाद के आदेशों पर वैकल्पिक है, btw है, तो आप कुछ और अधिक कीस्ट्रोक्स बचा सकता है।
इंगो करकट

2
:&&मुझे प्रति सप्ताह सैकड़ों कीस्ट्रोक्स बचाएंगे। धन्यवाद!
पोधेरेट्टी 926

यह मेरे vim में अंत में 'g' के बिना काम करता है। इसलिए हो सकता है कि जब आप लाइन रेंज को निर्दिष्ट करते हैं तो उसे वैश्विक ध्वज की आवश्यकता नहीं होती है
त्यार आर

3
@TayyarR रेंज में रेखाएँ (खड़ी, इसलिए बोलने के लिए) शामिल होती हैं, जबकि 'g' ध्वज यह निर्धारित करता है कि क्या लाइन के भीतर केवल एक या सभी मैच (इसलिए क्षैतिज रूप से) बदले जाते हैं।
इंगो करकट

388

सबको बदली करें:

:%s/foo/bar/g

'फू' की प्रत्येक घटना (सभी पंक्तियों में) को खोजें, और इसे 'बार' से बदलें।

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

:6,10s/foo/bar/g

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


4
यहाँ / g का उद्देश्य क्या है? क्षमा करें, मैं linux में नया हूँ
राजा अन्बझगन

4
@RajaAnbazhagan इस अभिव्यक्ति का अंतिम भाग, अंतिम के बाद /, जहां आप ऑपरेशन के लिए झंडे का संकेत देते हैं। यह कमांड आम तौर पर एक लाइन पर पहले मैच की जगह लेगी ; gध्वज के साथ यह सभी घटनाओं को प्रतिस्थापित करेगा।
लिट्टी सेप

17
यदि आप किसी अन्य व्यक्ति के काम को कॉपी और पेस्ट करने जा रहे हैं, तो आपको वास्तव में अपने स्रोतों (यानी, vim.wikia.com/wiki/Search_and_replace) का संदर्भ देना चाहिए।
एंड्रयू एस

2
%बात काम करता है! अन्यथा, यह केवल पहली घटना है।
संतोष कुमार

8
%=> इस कमांड को सभी लाइनों पर चलाएं। g=> एक ही पंक्ति में कई घटनाओं का मिलान करें।
शाहिहिन

55

साइड नोट के रूप में, लाइन नंबरों में टाइप करने के बजाय, उन लाइनों को हाइलाइट करें जहां आप विज़ुअल मोड में से किसी एक को ढूंढना / बदलना चाहते हैं:

  • VISUALमोड ( V)
  • VISUAL BLOCKमोड ( Ctrl+ V)
  • VISUAL LINEमोड ( Shift+ V, आपके मामले में सबसे अच्छा काम करता है)

एक बार जब आप लाइनों को बदलने के लिए चुनते हैं, तो अपना कमांड टाइप करें:

: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

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

27

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

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

दूसरी बार जब आपको समायोजित करने की आवश्यकता होती है, तो वह सीमा होती है, बजाय इसके सभी टाइप करने के बाद, मैं अंतिम कमांड को याद करूंगा और केवल रेंज को संपादित करूंगा।


21

यदि आप उलझन में हैं कि कौन सी सभी लाइनें प्रभावित होंगी, तो नीचे प्रयोग करें

 :%s/foo/bar/gc  

प्रत्येक 'फू' को 'बार' में बदलें, लेकिन पहले पुष्टि के लिए पूछें। हां के लिए 'y' और 'n' को न के लिए दबाएं। उसके बाद बचाना मत भूलना

:wq

2
आप वास्तव cमें सीमा को निर्दिष्ट करने के अलावा ध्वज का उपयोग कर सकते हैं , इसलिए :6,10s/<search_string>/<replace_string>/cकाम करता है। cके लिए खड़ा है confirm। मैं cध्वज का उपयोग अक्सर अकस्मात बदलने वाले शब्दों से रोकने के लिए करता हूं जहां मैंने इस बारे में नहीं सोचा था कि वे वहां भी मौजूद हैं।
वोल्फसन

16

VI खोज और कमांड उदाहरणों को प्रतिस्थापित करता है

हम कहते हैं कि आप एक शब्द "फू" और "बार" से बदलना चाहते हैं।

सबसे पहले [Esc]कुंजी मारा

टाइप करें: (कोलन) इसके बाद %s/foo/bar/और [एंटर] की को हिट करें

:%s/foo/bar/


11
आपकी :%s/<search_string>/<replace_string>/gकमांड पूरी फ़ाइल में सभी घटनाओं को बदल देगी। प्रश्न का उत्तर ठीक नहीं है, लेकिन फिर भी उपयोगी है :)
tanius

@tanius वास्तव में यह मेरी समस्या का सबसे सीधा जवाब था। आप "चयनित" तर्ज पर vim में स्ट्रिंग्स को ढूंढें और बदलें "
ओमिड एन

9

हमें वर्तमान पंक्ति संख्या में प्रवेश करने से परेशान होने की आवश्यकता नहीं है।

यदि आप प्रत्येक fooको barवर्तमान लाइन ( .) और दो अगली लाइनों ( +2) के लिए बदलना चाहते हैं , तो बस यह करें:

:.,+2s/foo/bar/g

यदि आप परिवर्तन करने से पहले पुष्टि करना चाहते हैं, तो इसके gसाथ बदलें gc:

:.,+2s/foo/bar/gc

एक और अच्छी बात जो मैं अक्सर उपयोग करता हूं :.,$s/foo/bar/gcवह है चालू और शुरू करने से बदलने के लिए फ़ाइल के अंत तक।
वोल्फसन

3

खोजें और बदलें

:%s/search\|search2\|search3/replace/gci

g => वैश्विक खोज

c => पहले पुष्टि के लिए पूछें

i => केस असंवेदनशील

यदि आप पुष्टि के बिना प्रत्यक्ष प्रतिस्थापन चाहते हैं, तो कमांड के नीचे का उपयोग करें

:%s/search/replace/g

यदि आप प्रत्येक प्रतिस्थापित के लिए पुष्टि चाहते हैं तो नीचे दिए गए आदेश को चलाएं

:%s/search/replace/gc

पहले पुष्टि के लिए पूछें, यहां खोज असंवेदनशील होगी।

:%s/search/replace/gci

1

दृश्य चयन के माध्यम से सीमा को निर्दिष्ट करना ठीक है, लेकिन जब बस एक-दो लाइनों पर बहुत ही सरल ऑपरेशन होते हैं जो एक ऑपरेटर द्वारा चुने जा सकते हैं तो सबसे अच्छा होगा कि आप इन कमांड को ऑपरेटर के रूप में लागू करें।

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

!ip

इसे "ऑपरेटर लागू करें! एक पैराग्राफ के अंदर" के रूप में पढ़ा जाना चाहिए। फ़िल्टर ऑपरेटर कमांड मोड शुरू करता है और स्वचालित रूप से एक शाब्दिक द्वारा अनुसरण की गई लाइनों की सीमा सम्मिलित करता है "!" कि आप बस के बाद हटा सकते हैं। यदि आप इसे निम्नलिखित पैराग्राफ पर लागू करते हैं:

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

"एपी!" दबाने के बाद परिणाम इस तरह होगा:

:.,.+5

जैसा कि '।' (बिंदु) का अर्थ है वर्तमान लाइन, वर्तमान लाइन के बीच की सीमा और ऑपरेशन के बाद 5 लाइनों का उपयोग किया जाएगा। अब आप स्थानापन्न कमांड को पहले की तरह ही जोड़ सकते हैं।

बुरा हिस्सा यह है कि यह आसान नहीं है कि ऑपरेटर को बाद के आवेदन के लिए पाठ का चयन करना। अच्छी बात यह है कि यह अन्य समान टेक्स्ट रेंज (इस मामले में, पैराग्राफ) के लिए दृष्टि के विभिन्न आकार के साथ सीमा के सम्मिलन को दोहरा सकता है। यानी, यदि आप बाद में रेंज के बड़े पैराग्राफ को चुनना चाहते हैं '।' यह सही होगा।

इसके अलावा, यदि आप ऑपरेशन की सीमा का चयन करने के लिए शब्दार्थ पाठ ऑब्जेक्ट्स का उपयोग करने का विचार पसंद करते हैं, तो आप मेरे प्लगइन EXtend.vim की जांच कर सकते हैं जो समान लेकिन एक आसान तरीके से कर सकते हैं।


0

इस सवाल का जवाब देने के लिए:

:40,50s/foo/bar/g

40 वीं पंक्ति और 50 वीं पंक्ति (सम्मिलित) के बीच इन पंक्तियों में बार के साथ फू को बदलें, जब इस कमांड को निष्पादित करें तो आप वर्तमान में किसी भी पंक्ति में कर सकते हैं।

:50,40s/foo/bar/g

यह भी काम करता है, विम आपको कम्फर्ट के लिए कहेगा और फिर आपके लिए रिप्लेसमेंट करेगा जैसे कि आपके पास पहला कमांड है।

:,50s/foo/bar/g

वर्तमान में और 50 वीं पंक्ति (सम्मिलित) के बीच की पंक्तियों के बीच फू को इन पंक्तियों में बदलें। (यदि आप एक पंक्ति में हैं तो 50 वीं पंक्ति के बाद vim फिर से पुष्टि के लिए पूछेगा)

ग्रहण के विकर और वाइपर प्लग के बीच अंतर को स्पष्ट करने के लिए:

वैपर में ध्यान दें

:,50s/foo/bar/g कमांड काम नहीं करेगा।

:50,40s/foo/bar/g comfirmation के लिए बिना पूछे काम करेंगे।

(रैपर संस्करण 0.74.0 या पुराने के लिए)।


-5
/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.) के साथ बदल दिया जाएगा ।


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

1
इसके अलावा "COMMAND" क्या है? और आप लीनिंग टूथपिक सिंड्रोम से पीड़ित हैं ।
मार्टिन टूरनोइज

कि सिंड्रोम का इलाज करने के लिए, यदि आप डिफ़ॉल्ट के बजाय परिसीमक के रूप में एक और चरित्र का उपयोग कर सकते /है, जैसे !, @, _::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g
MortezaE
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.