मुझे लगता है कि निम्नलिखित कमांड को काम करना चाहिए:
:%s/^\(.*\)\(\n\1\)\+$/\1/
स्पष्टीकरण:
हम परिवर्तन के लिए पूरी फ़ाइल पर प्रतिस्थापन आदेश का उपयोग pattern
में string
:
:%s/pattern/string/
यहाँ pattern
है ^\(.*\)\(\n\1\)\+$
और string
है \1
।
pattern
इस तरह तोड़ा जा सकता है:
^\(subpattern1\)\(subpattern2\)\+$
^
और $
क्रमशः लाइन की शुरुआत और लाइन के अंत से मेल खाते हैं।
\(
और \)
इसका उपयोग संलग्न करने के लिए किया जाता है subpattern1
ताकि हम इसे बाद में विशेष संख्या से संदर्भित कर सकें \1
।
उन्हें संलग्न करने के लिए भी उपयोग किया जाता है subpattern2
ताकि हम इसे 1 या उससे अधिक बार परिमाणक के साथ दोहरा सकें \+
।
subpattern1
है .*
.
नई लाइन को छोड़कर किसी भी चरित्र से मेल खाता हुआ metacharacter है और *
एक परिमाणक कि पिछले चरित्र 0, 1 या अधिक बार से मेल खाता है।
इसलिए बिना .*
किसी नई पंक्ति के किसी भी पाठ से मेल खाता है।
subpattern2
है \n\1
\n
एक नई लाइन से मेल खाता है और \1
एक ही पाठ कि अंदर पहले मिलान किया गया था से मेल खाता है \(
, \)
यहाँ जो है subpattern1
।
तो pattern
इसे इस तरह से पढ़ा जा सकता है:
पंक्ति की एक शुरुआत ( ^
) के बाद कोई भी नई पंक्ति नहीं है ( .*
) के बाद एक नई पंक्ति ( \n
) और फिर एक ही पाठ ( \1
), बाद के दो को एक या अधिक बार दोहराया जा रहा है ( \+
), और अंत में लाइन का अंत ( $
) ।
जहां भी pattern
मिलान किया जाता है (समान लाइनों का एक ब्लॉक), प्रतिस्थापन कमांड इसे बदल देता है जिसके साथ string
यहां \1
(ब्लॉक की पहली पंक्ति) है।
यदि आप यह देखना चाहते हैं कि आपकी फ़ाइल में कुछ भी बदले बिना लाइनों के कौन से ब्लॉक प्रभावित होंगे, तो आप hlsearch
विकल्प को सक्षम कर सकते हैं और n
कमांड के अंत में प्रतिस्थापन ध्वज जोड़ सकते हैं :
:%s/^\(.*\)\(\n\1\)\+$/\1/n
अधिक दानेदार नियंत्रण के लिए, आप c
प्रतिस्थापन ध्वज को जोड़ने के बजाय लाइनों के प्रत्येक ब्लॉक को बदलने से पहले एक पुष्टिकरण के लिए पूछ सकते हैं :
:%s/^\(.*\)\(\n\1\)\+$/\1/c
प्रतिस्थापन आदेश पढ़ने के बारे में अधिक जानकारी के लिए :help :s
,
प्रतिस्थापन झंडे के लिए :help s_flags
,
विभिन्न अक्षरों से परे और परिमाणकों के लिए पढ़ने के लिए :help pattern-atoms
,
और के लिए vim में रेगुलर एक्सप्रेशन को पढ़ने के इस ।
संपादित करें: वाइल्डकार्ड ने कमांड $
के अंत में एक समस्या को ठीक किया pattern
।
इसके अलावा ब्लडगैन का एक ही कमांड का एक छोटा और अधिक पठनीय संस्करण है।
$
हालाँकि, इसमें आपकी कमांड की जरूरत है । अन्यथा यह एक पंक्ति के साथ अप्रत्याशित चीजें करेगा जो पिछली पंक्ति के समान पाठ से शुरू होता है , लेकिन कुछ अन्य अनुगामी अक्षर हैं। यह भी ध्यान दें कि आपके द्वारा दिया गया मूल कमांड कार्यात्मक रूप से मेरे उत्तर के बराबर है:%!uniq
, लेकिन हाइलाइट और कन्फर्मेशन फ्लैग अच्छे हैं।