मुझे लगता है कि निम्नलिखित कमांड को काम करना चाहिए:
:%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, लेकिन हाइलाइट और कन्फर्मेशन फ्लैग अच्छे हैं।