कैसे करता है: g / / / / / /, / / ​​/ जे (एक खाली करने के लिए कई रिक्त लाइनों को कम) काम में?


21

लेख में, विम रेगुलर एक्सप्रेशंस , ओलेग रिकी ने कई रिक्त लाइनों को एक ही रिक्तता को कम करने के लिए निम्न आदेश दिया है:

:g/^$/,/./-j

क्या कोई यह वर्णन कर सकता है कि यह कैसे काम करता है?

मैं :gकमांड और रेगुलर एक्सप्रेशन जानता हूं । लेकिन मुझे समझ नहीं आया कि भाग क्या /,/./-jकरता है।

जवाबों:


24

यह वास्तव में काफी सरल है। चलो इसे तोड़ दो। exआदेश

g/^$/xyzzy

सभी खाली लाइनों की खोज करेंगे और उनमें से प्रत्येक पर xyzzyकमांड (एक मनमाना exकमांड) निष्पादित करेंगे। ध्यान दें कि xyzzyयह एक वास्तविक ex कमांड नहीं है , यह केवल अगले पैराग्राफ के अनुसार प्लेसहोल्डर के रूप में है।

यहाँ मुश्किल सा यह है कि xyzzyआपके मामले में "कमांड" अभी तक एक और खोज कमांड है:

,/./-j

,/./-एक सीमा निर्दिष्ट करता है। यह फ़ॉर्म का है <start>,<end>और, क्योंकि अल्पविराम से पहले कुछ भी नहीं है, यह वर्तमान रेखा को मानता है (जहां आपको रिक्त पंक्ति मिली थी) प्रारंभ है।

अल्पविराम के बाद है /./-जो साधन अगले वर्ण के लिए (खोज .किसी भी चरित्र का मतलब है) फिर वापस एक लाइन अप ( /./-के लिए कम है /./-1के बाद से एक है, तो कोई मूल्य नहीं दिया जाता है निहित है)। आप उस .गैर-रिक्त रेखा पर उस पैटर्न को खोज लेंगे जिसका आप संचालन कर रहे हैं।

दूसरे शब्दों में, सीमा के अंत के बाद या वर्तमान में आप जिस पर काम कर रहे हैं, वह अंतिम रिक्त पंक्ति है।

फिर आप उस सीमा पर एक कार्य को अंजाम देते हैं।

यदि रेंज की शुरुआत और अंत बराबर थे (केवल एक खाली लाइन अनुभाग में थी), तो ज्वाइन कुछ नहीं करता है। यदि वे समान नहीं हैं, तो जुड़ने से वे सभी जुड़ जाएंगे।

इस तरह से यह एक में कई रिक्त लाइनों को जोड़ती है।

एक उदाहरण देखें (लाइन नंबर केवल स्पष्टीकरण के लिए हैं, वे वास्तविक फ़ाइल में नहीं हैं):

1 Line 1
2
3 Line 3
4 Line 4
5
6
7
8
9 Line 9

g/^$/आदेश सभी खाली लाइनों खोजने के लिए और उन पर अपनी कार्रवाई को (इन पंक्तियों के 2, 5, 6, 7 और 8 हैं) होगा।

पंक्ति 2 के लिए, 2 ,/./-jसे 2 तक की सीमा निर्धारित करेगा (अगला .पंक्ति 3 पर पाया जाता है, फिर 2 प्राप्त करने के लिए 1 घटाएं)। 2,2 की श्रेणी में शामिल होने से कुछ नहीं होता है।

पंक्ति 5 के लिए, ,/./-j5 से 8 तक एक श्रेणी स्थापित करेगा (अगली .पंक्ति 9 पर पाया गया तो 1 घटाएँ)। 5,8 श्रेणी में शामिल होने से उन सभी लाइनों को एक साथ जोड़ दिया जाएगा।

ऑपरेशन उन लाइनों पर नहीं किया जाता है जो पहले के ऑपरेशन के हिस्से के रूप में गायब हो जाते हैं। ऐसा इसलिए है क्योंकि इससे उन पंक्तियों को संसाधित करने का कोई मतलब नहीं होगा जो पहले चक्र में हटा दी गई हैं।

दूसरे शब्दों में, क्योंकि 8 के माध्यम से 6 लाइनों को हटा दिया जाता है (लाइन 5 के साथ संयुक्त), वैश्विक कमांड उसके बाद उन पर काम नहीं करता है।

यह इस तथ्य पर आधारित है कि vimप्रलेखन दो-पास एल्गोरिथ्म बताता है, एक लाइनों को चिह्नित करने के लिए, एक ऑपरेशन को करने के लिए।


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