मैं उपयोग कर सकता हूं
:5,12s/foo/bar/g
खोज करने के लिए fooऔर इसे barलाइनों 5 और 12 के बीच से बदल दें । मैं इसे केवल 5 और 12 पंक्ति में कैसे कर सकता हूं (और बीच में लाइनों में नहीं)?
जवाबों:
विम के पास विशेष नियमित अभिव्यक्ति परमाणु हैं जो कुछ लाइनों, स्तंभों आदि में मेल खाते हैं; मैचों को सीमित करने के लिए आप उनका उपयोग कर सकते हैं (संभवतः रेंज के अतिरिक्त):
:5,12s/\(\%5l\|\%12l\)foo/bar/g
देख :help /\%l
आप पंक्ति 5 पर प्रतिस्थापन कर सकते हैं और इसे पंक्ति 12 पर न्यूनतम प्रयास के साथ दोहरा सकते हैं:
:5s/foo/bar
:12&
जैसा कि इंगो द्वारा बताया गया है, :&अपने झंडे को भूल जाता है। जब से आप उपयोग कर रहे हैं /g, सही कमांड होगा :&&:
:5s/foo/bar/g
:12&&
देखिये :help :&और दोस्तों
:&का उपयोग करने के लिए +1 । अगर वहाँ झंडे हैं ( s/../../g), एक का उपयोग करना है :&&, हालांकि ...
\(\%5l\|\%12l\)है की तुलना में अधिक अस्पष्ट है:&
आप हमेशा cअंत में एक जोड़ सकते हैं । यह प्रत्येक मैच के लिए पुष्टि के लिए पूछेगा।
:5,12s/foo/bar/gc
gझंडा है)
n5 या 6 बार दबाने वाली बात करते हैं \(\%5l\|\%12l\), विकल्प बयान में जोड़ने की तुलना में कोई अधिक महत्वपूर्ण है ?
दिलचस्प सवाल। ऐसा लगता है कि केवल श्रेणी चयन और कोई एकाधिक पंक्ति चयन नहीं है:
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/
आप उपयोग कर सकते हैं ed- vi और vim के समान आदेशों के साथ एक पंक्ति उन्मुख पाठ संपादक। यह शायद vi और vim से पूर्ववर्ती है।
एक स्क्रिप्ट में (यहां एक दस्तावेज का उपयोग करते हुए, जो EndCommand मार्कर तक इनपुट को संसाधित करता है) ऐसा लगेगा:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
जाहिर है, एड कमांड का उपयोग कमांड लाइन पर भी किया जा सकता है।
vimविकल्प पर एक फायदा नहीं दिख रहा है ।
:s, लेकिन अभी भी :sकमांड का दोहराव है (जो रोमेनिल के समाधान से बचा जाता है)।
sedहालांकि, होगी ...