डुप्लिकेट लाइनें "x" के साथ शुरू होती हैं, "x" को "y" के साथ डुप्लिकेट में बदल देती हैं?


9

मेरे पास निम्न पैटर्न वाली फाइल है:

foo 111
baz
foo 222
baz
foo 333
baz

जिसे चालू करने की आवश्यकता है

foo 111
bar 111
baz
foo 222
bar 222
baz
foo 333
bar 333
baz

तो, सभी लाइनों के साथ शुरू होने वाली डुप्लिकेट करें foo, और केवल fooडुप्लिकेट में बदलें लेकिन बाकी लाइन (जो प्रत्येक मामले में भिन्न होती है) को बरकरार रखें। यह कैसे करना है?


यदि आप regexp पर नर्क-बाउंड नहीं हैं, तो एक मैक्रो बस ठीक करेगा। वास्तव में इस तरह के सरल मामलों में बहुत ज्यादा मायने नहीं रखता है, लेकिन अगर आपके पास कुछ अधिक जटिल है, तो यह एक बहुत ही वैध विकल्प है।
फिलिप्रेंक

जवाबों:


19

हेयर यू गो:

:g/foo/t.|s//bar

सड़ते हुए:

:g/foo/    " start a global command applied on all lines matching 'foo'
t.         " duplicate the current line (the cursor is now on the new line)
|          " chain a new command
s//bar     " substitute the last searched element with 'bar'

क्योंकि gकमांड सर्च पैटर्न को अपडेट करेगा, इसलिए आप विकल्प कमांड में बदलने के लिए पैटर्न को छोड़ सकते हैं। (रेफ:, के :h :gलिए खोज search pattern)।


पुराना संस्करण:

:g/foo/norm! yyp:s/foo/bar^M

सड़ते हुए:

:g            start a global command
/foo/         apply only on lines having 'foo'
norm!         execute a normal command
yyp           duplicate the line
:s//bar       replace foo with bar on the line (the duplicated one)
^M            add enter to execute the substitution

सम्मिलित करने के लिए ^Mप्रेस Ctrl+vऔर enter

नोट : मैं मूल रूप से "पुराने" संस्करण के साथ आया था, इससे पहले कि मैं tकमांड के बारे में सीखता । मैं इसे छोड़ दूँगा लेकिन मैं इसे इस्तेमाल करने की सलाह नहीं दूँगा। पहले वाला क्लीनर ज्यादा सीधा है।


हल किया गया, 'सरल संस्करण' ने पूरी तरह से काम किया। हालाँकि, पहला संस्करण, जिसके परिणामस्वरूप डुप्लिकेट लाइन अभी भी शुरू हो रही है foo...
LB7979

अजीब है, क्या आपने ^Mमुझे समझाया था?
nobe4

मेरा बुरा, वह अच्छी तरह से पढ़ा नहीं था। पहला समाधान भी काम करता है!
LB7979

मुझे नहीं पता कि आप जटिल संस्करण को क्यों परेशान करते हैं। सरल संस्करण है ... सरल। ;) (POSIX आज्ञाकारी होने का उल्लेख नहीं है।) पहले क्यों नहीं डाला?
वाइल्डकार्ड

1
शुरू में मैं पहले संस्करण के साथ आया, जो मेरे लिए अधिक स्वाभाविक था, क्योंकि उस समय मुझे जानकारी नहीं थी t, और फिर मैंने दूसरा जोड़ा। मैं ऑर्डर बदल दूंगा, आप सही हैं। कैसे के बारे में पहले एक POSIX जा रहा है?
nobe4

1

मैं हर समय इस तरह से सामान करता हूं और बस कुछ ऐसा करता %s/^foo \(.*\)/foo \1\rbar \1/हूं (आंशिक रूप से क्योंकि मैं भी इसी तरह के बहुत सारे कार्य करता हूं जिन्हें कॉपी फ़ंक्शन का उपयोग करके कुछ चतुर में नहीं बदला जा सकता है, और \(.*\)अब तक मेरी मांसपेशियों का हिस्सा है)।

मुझे संदेह है कि यह POSIX- अनुरूप नहीं है (यह अन्य vi क्लोन पर काम नहीं करता है), लेकिन अधिकांश अन्य vi क्लोन पर काम करने के लिए उपयोग करने के बजाय ^M( C-VReturn) \rलगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.