विशिष्ट लाइनों में विम को खोजें और बदलें


94

मैं उपयोग कर सकता हूं

:5,12s/foo/bar/g

खोज करने के लिए fooऔर इसे barलाइनों 5 और 12 के बीच से बदल दें । मैं इसे केवल 5 और 12 पंक्ति में कैसे कर सकता हूं (और बीच में लाइनों में नहीं)?

जवाबों:


75

विम के पास विशेष नियमित अभिव्यक्ति परमाणु हैं जो कुछ लाइनों, स्तंभों आदि में मेल खाते हैं; मैचों को सीमित करने के लिए आप उनका उपयोग कर सकते हैं (संभवतः रेंज के अतिरिक्त):

:5,12s/\(\%5l\|\%12l\)foo/bar/g

देख :help /\%l


8
मुझे उम्मीद से अधिक जटिल तरीका है लेकिन मेरे सवाल का पूरी तरह से जवाब देता है। धन्यवाद!
pfnuesel

55

आप पंक्ति 5 पर प्रतिस्थापन कर सकते हैं और इसे पंक्ति 12 पर न्यूनतम प्रयास के साथ दोहरा सकते हैं:

:5s/foo/bar
:12&

जैसा कि इंगो द्वारा बताया गया है, :&अपने झंडे को भूल जाता है। जब से आप उपयोग कर रहे हैं /g, सही कमांड होगा :&&:

:5s/foo/bar/g
:12&&

देखिये :help :&और दोस्तों


10
अस्पष्ट :&का उपयोग करने के लिए +1 । अगर वहाँ झंडे हैं ( s/../../g), एक का उपयोग करना है :&&, हालांकि ...
इंगो करकट

10
@IngoKarkat, निष्पक्ष होने के लिए, मुझे लगता \(\%5l\|\%12l\)है की तुलना में अधिक अस्पष्ट है:&
DoubleDown

13

आप हमेशा cअंत में एक जोड़ सकते हैं । यह प्रत्येक मैच के लिए पुष्टि के लिए पूछेगा।

:5,12s/foo/bar/gc

1
यह एक बुरा सपना हो सकता है अगर लाइनों 5 और 12 के बीच बहुत सारे मैच हों (ध्यान रखें कि इसमें एक gझंडा है)
DoubleDown

1
@ डबलडाउन इसका मतलब एक सार्वभौमिक समाधान नहीं है (जहां कई संभावित उम्मीदवार हैं), लेकिन ज्यादातर मामलों में क्या आप वास्तव में n5 या 6 बार दबाने वाली बात करते हैं \(\%5l\|\%12l\), विकल्प बयान में जोड़ने की तुलना में कोई अधिक महत्वपूर्ण है ?
डीन

मुझे यह उपयोगी लगता है, मैं हर दूसरी पंक्ति को बदलना चाहता था, यह उस तेजी से होता था जो मैंने किया था।
तैक्तक

8

दिलचस्प सवाल। ऐसा लगता है कि केवल श्रेणी चयन और कोई एकाधिक पंक्ति चयन नहीं है:

http://vim.wikia.com/wiki/Ranges

हालाँकि, यदि आपके पास पंक्ति 5 और 12 पर कुछ विशेष है, तो आप :gऑपरेटर का उपयोग कर सकते हैं । यदि आपकी फ़ाइल इस तरह दिखती है (केवल संदर्भ के लिए संख्या):

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

और आप बदलना चाहते oneद्वारा enoलाइनों जहां वहाँ पर enilके बजाय line:

:g/enil/s/one/eno/

5
यह वास्तव में बहुत कुछ
डबलडाउन

1

आप उपयोग कर सकते हैं ed- vi और vim के समान आदेशों के साथ एक पंक्ति उन्मुख पाठ संपादक। यह शायद vi और vim से पूर्ववर्ती है।

एक स्क्रिप्ट में (यहां एक दस्तावेज का उपयोग करते हुए, जो EndCommand मार्कर तक इनपुट को संसाधित करता है) ऐसा लगेगा:

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

जाहिर है, एड कमांड का उपयोग कमांड लाइन पर भी किया जा सकता है।


3
मुझे vimविकल्प पर एक फायदा नहीं दिख रहा है ।
बर्नहार्ड

1
और विम के साथ भी यही किया जा सकता है; वास्तव में संख्याओं को पहले रखा जा सकता है :s, लेकिन अभी भी :sकमांड का दोहराव है (जो रोमेनिल के समाधान से बचा जाता है)।
इंगो करकट

मेरा विचार था कि उपयोगकर्ता संपादन के लिए दो से अधिक लाइनों का एक बड़ा सौदा चुनना चाहता है। उस मामले में एक गैर-संवादात्मक दृष्टिकोण ब्याज का हो सकता है - जो AFAIK विम के साथ नहीं किया जा सकता है।
संदिग्ध

1
ओह, विम ऐसा कर सकता है (जैसे "पूर्व" मोड में), लेकिन आप सही कह रहे हैं कि एक अन्य उपकरण को एक इंटरैक्टिव संपादक पर प्राथमिकता दी जानी चाहिए। मेरी प्राथमिकता sedहालांकि, होगी ...
इंगो करकट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.