जवाबों:
विम: जी कमांड को इस तरह के कार्य के लिए डिज़ाइन किया गया है; हर लाइन पर एक एकल क्रिया चल रही है जो एक विशेष पैटर्न से मेल खाती है। यहाँ मेरा जवाब है:
:g/.\n\n\@!/norm o
पैटर्न मैं उपयोग कर रहा हूँ /.\n\n\@!/
। इसके घटक टुकड़ों में तोड़कर:
.
लाइन में किसी भी वर्ण से मेल खाता है। (विचार से किसी भी मौजूदा खाली लाइनों को तुरंत त्यागने के लिए इस्तेमाल किया जाता है)\n
ऊपर के वर्ण के अंत में एक एकल \ n मेल खाता है\n\@!
मैच को विफल कर देता है अगर पहले वाले \ n के तुरंत बाद दूसरा \ n है।( रेगुलर एक्सप्रेशंस में ऐसे ही और स्पेसिफिक मैचर्स के :h E59
बारे में अधिक जानकारी के लिए जाँच करें \@!
- एक कपल और भी हैं!)
तो: g कमांड के regex ने अब प्रत्येक गैर-रिक्त रेखा का चयन किया है, जिसे एक एकल पंक्ति द्वारा समाप्त किया गया है, और जिसके बाद एक खाली पंक्ति नहीं है।
एक :g
स्टेटमेंट में पैटर्न के बाद मिलान लाइनों पर चलने के लिए कमांड आती है। इस मामले में, मैंने इसे एक सामान्य मोड कमांड (संक्षिप्त में norm
) निष्पादित करने के लिए कहा है , और चलाने के लिए कमांड बस है o
, जो वर्तमान लाइन के नीचे एक खाली लाइन सम्मिलित करता है।
तो एक साथ लिया गया, कमांड हर लाइन को ढूंढता है जिसके नीचे एक खाली लाइन नहीं है, और एक जोड़ता है। और यह सब वहाँ है! आप अधिक फैंसी चीजों के साथ (और यह नकारात्मक बहन है ) कर सकते हैं के लिए vim wiki की पावर ऑफ जी लेख की जांच करना पसंद कर सकते हैं - यह उन आश्चर्यजनक उपयोगी कमांडों में से एक है जो आप जल्द ही भरोसा करने के लिए बढ़ते हैं, और फिर संपादकों में बहुत याद आते हैं जिसके पास नहीं है।:g
:v
:%s/$/
, फिर हिट करें ^V
, फिर हिट करें Enter
।
:%s/$/<C-V><CR><CR>
(keypress के आम vim- लोक एन्कोडिंग का उपयोग करने के लिए), कि दृष्टिकोण बस प्रत्येक पंक्ति के बाद एक नई पंक्ति जोड़ता है। यही है, वे रेखाएँ जो पहले से ही ब्लॉक्स से अलग हो चुकी हैं (देखें पंक्ति 3 -> लाइन 4, उदाहरण पाठ में) अतिरिक्त रिक्त लाइनें प्राप्त करने के लिए हवा। मूल प्रश्न अतिरिक्त रिक्त लाइनों को जोड़ने से बचने के लिए था जहां वे पहले से ही शुरुआती पाठ में मौजूद थे।
जब मैंने @ NeilForester की वैश्विक खोज और प्रतिस्थापित उत्तर का परीक्षण किया, तो मैंने पाया कि यह हर दूसरे इच्छित प्रतिस्थापन को लगातार गैर-रिक्त लाइनों में याद करती है यदि लाइनों में प्रत्येक में केवल एक ही वर्ण होता है। ऐसा प्रतीत होता है कि पैटर्न के कारण प्रत्येक अवसर पर पिछले चरित्र से मेल खाने के बाद शुरू होता है ।
लुकबाइंड और लुकहेड का उपयोग करने से यह समस्या हल हो जाती है और रेगेक्स थोड़ा छोटा हो जाता है:
:%s/\n\@<!\n\n\@!/\r\r/g
\n\@<!\n
किसी भी लाइनब्रेक का मतलब है कि एक और लाइनब्रेक के बाद यह सही नहीं है? लेकिन मैं समझ नहीं पाया कि \n\@!
इसका क्या मतलब है। मैं इसे समझना चाहूंगा ताकि मैं इसे अन्य खोज पैटर्न पर
\n\@<!\n
इसका मतलब है कि कोई भी लाइनब्रेक जो किसी अन्य लाइनब्रेक का तुरंत पालन नहीं करता है। \n\@!
शून्य चौड़ाई के साथ मेल खाता है यदि पूर्ववर्ती परमाणु (जैसे \n
) जो कुछ भी होता है उससे ठीक पहले मेल नहीं खाता। :help \@<!
इस पर प्रलेखन देखने की कोशिश करो । I
दूसरा रास्ता:
%s/\(.\)\n\(.\)/\1\r\r\2/
जिसका मतलब है,
\(.\) match and capture a non-newline character,
\n match a newline
\(.\) match and capture a non-newline character
इसके साथ बदलें: पहला कैप्चर, डबल न्यूलाइन, और दूसरा कैप्चर।
उदाहरण के लिए, में line1\nLine2
परिणाम \1 = 1
और \2 = L
।
अगर मैं ग़लत हूं तो मेरी गलती सुझाएं। मेरा मानना है कि जब आप कमांड मोड का उपयोग करते हैं तो लाइन के नीचे जाने के लिए आप अक्षर k का उपयोग करते हैं। फिर इन्सर्ट मोड डालें और अगली लाइन जोड़ें। आवश्यक के रूप में दोहराएं? उम्मीद है की यह मदद करेगा!
k
एक लाइन चलती है। j
एक पंक्ति नीचे जाती है।
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
फिर दबाएं <F2>
। यह लगातार दो गैर-रिक्त लाइनों की खोज करेगा, और फिर उनके बीच एक पंक्ति को बार-बार जोड़ देगा।
संपादित करें:
एक एकल, वैश्विक खोज और प्रतिस्थापित करने के लिए यह एक वैकल्पिक तरीका है:
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
मुझे नहीं पता कि आपकी फ़ाइल कितनी लंबी है, लेकिन सबसे सरल विधि o
में से एक कमांड मोड में है। और अगली पंक्ति में .
। यह सरल मैक्रो को लोड किया जा सकता है।
:%norm o
लेकिन यह पता चलता है कि इस मामले में काम नहीं करता हैo
। +1