फ़ाइल में स्थायी लाइन नंबर कैसे जोड़ें?


22

मेरे पास इस तरह एक पाठ फ़ाइल है (विंडोज़ पर जीवीएम का उपयोग करके)

foo bar baz quux 
corge grault garply 
waldo fred plugh 
[...150 more lines...]
xyzzy thud

मैं फ़ाइल में प्रत्येक पंक्ति में एक संख्या जोड़ना चाहता हूं। उपयोग नहीं कर रहा है :set number, लेकिन प्रत्येक पंक्ति से पहले पाठ के रूप में संख्या को जोड़ने के लिए, निम्नानुसार है, इसलिए संख्या फ़ाइल का हिस्सा है।

1. foo bar baz quux 
2. corge grault garply 
3. waldo fred plugh 
[...~150 more lines...]
155. xyzzy thud

awkशायद इस काम के लिए उपकरण है। लेकिन मैं विंडोज (आह) पर हूं।
roblogic

यहाँ पहले से ही उत्तर दिया गया है , कभी भी मन नहीं है :)
लुटेरा

1
शायद .. या यह अधिक सामान्य है?
मूरू

यह समान है, लेकिन मुझे नहीं पता होगा कि स्थायी लाइन नंबर क्या हैं। दूसरी बात यह है कि विशेष रूप से विंडोज पर जीवीएम के लिए सभी पंक्तियों (और उत्तर यही करता है) के बारे में है और यह केवल सादे पैराग्राफ में एक पैरा के लिए सरल क्रमांकित सूची है।
kenorb

3
ठीक है, मुझे लगता है कि पोस्ट "स्थायी" ओ.टी. का उपयोग करता है यह दर्शाता है कि बफर को संशोधित किया जाना है, और यह कि नंबर कुछ विशुद्ध रूप से दृश्य वस्तु नहीं हैं (जैसे आप)। विंडोज पर gvim को निर्दिष्ट करने का कारण बाहरी उपयोगिताओं से बचना है जैसे catया nl, जो संख्या रेखाएं कर सकते हैं, लेकिन आम तौर पर विंडोज पर उपलब्ध नहीं हैं (जैसा कि ओपी उनके बारे में टिप्पणी से इंगित करता है awk)। शीर्ष दो समाधान शुद्ध विम हैं। अन्त में, सभी पंक्तियाँ बनाम एक पैरा केवल श्रेणी चयन की बात है। स्पष्ट रूप से एक बड़ा मुद्दा नहीं है।
मूरू

जवाबों:


37

शुद्ध विम फैशन में:

:%s/^/\=line('.').". "

स्पष्टीकरण:

:%s/^/            " the substitution will be applied to the beginning of every line
\=                " the rest of the replacement part is an expression
line('.').". "    " the expression returns the current line number concatenated with a dot and a space

देखें :help \=और :help line()

प्रतिस्थापन भाग में एक अभिव्यक्ति का उपयोग करना बहुत शक्तिशाली है और एफडब्ल्यूआईडब्ल्यू विम्सस्क्रिप्ट में प्रवेश का एक बहुत अच्छा बिंदु है।


मैं vimrc में कीमैप में यह बहुत उपयोगी कमांड कैसे जोड़ सकता हूं?
कॉस्मिकमैगा

प्रतिस्थापन के लिए विम मदद विषय पर जाने के लिए::help sub-replace-expression
akurtser

9

विम मैक्रोज़ के बारे में एक अच्छी बात यह है कि वे पुनरावृत्ति कर सकते हैं (वे खुद को आह्वान कर सकते हैं):

  1. रजिस्टर रजिस्टर साफ़ करें: qqq
  2. पहली पंक्ति में संख्या जोड़ें: ggI1.(स्थान मत भूलना!)
  3. लाइन शुरू करने और मैक्रो की रिकॉर्डिंग शुरू करने के लिए वापस जाएँ: 0qq
  4. संख्या की प्रतिलिपि बनाएँ: yW
  5. एक पंक्ति नीचे ले जाएँ और संख्या पेस्ट करें: +P
  6. लाइन की शुरुआत में वापस जाएँ और संख्या बढ़ाएँ: 0<c-a>
  7. लाइन के शुरू होने पर वापस जाएं (इसलिए मैक्रो तब नहीं टूटता जब यह दोहरे आंकड़े तक पहुंच जाता है!): 0
  8. एक बार मैक्रो को कॉल करें, इसे पुनरावर्ती बनाने के लिए। इस बिंदु पर, रजिस्टर q में अभी भी कुछ नहीं है, इसलिए कुछ भी नहीं होगा @q:।
  9. मैक्रो सहेजें: q
  10. मैक्रो को एक बार कॉल करें, और स्पार्क्स को उड़ते हुए देखें! " @@

मैक्रो तब तक खुद को इनवोक करना जारी रखेगा जब तक यह फ़ाइल के अंत तक नहीं पहुंचता।

आप कई अन्य समान समस्याओं के लिए पुनरावर्ती मैक्रो ट्रिक का उपयोग कर सकते हैं, इसलिए इसके बारे में पता होना एक अच्छा है।

यदि आप किसी कारण के लिए एक पुनरावर्ती मैक्रो का उपयोग नहीं करना चाहते हैं, तो आप चरण 1 और 8 को छोड़ सकते हैं, और मैक्रो को कई बार चलाने के लिए एक गिनती का उपयोग कर सकते हैं , जैसे 100@qकि मैक्रो q100 बार चलेगा ।


1
शक्तिशाली सामान, मैं आपकी महारत को नमन करता हूं।
मैक्रों

1
@ropata, एक मैक्रो केवल (ज्यादातर) सामान्य मोड कमांड का एक अनुक्रम है।
रोमेनियल

1
@romainl मुझे लगता है कि यह कीस्ट्रोक्स के अनुक्रम के रूप में सोचना बेहतर है ।
अमीर

2
@ यह पूर्व कमांड सहित कई चीजों का एक क्रम हो सकता है।
रोमेनिल

2
@romainl हाँ, यही कारण है कि मुझे लगता है कि इसे कीस्ट्रोक्स के रूप में सोचना सबसे अच्छा है। यह वापस वही खेलता है जो आप कीबोर्ड पर टाइप करते हैं (सहित, जैसा कि आप कहते हैं, पूर्व कमांड), जैसे कि आपने यह सब मैन्युअल रूप से टाइप किया था।
रिच

7

मैं इस तरह के कार्यों को पूरा करने के लिए विम ग्लोबल कमांड का उपयोग करना पसंद करता हूं। यह एक पंक्ति की शुरुआत में पुनरावृत्ति को जोड़ने या पाठ में एक प्रतीक को संशोधित करने के लिए लागू होता है। यह अन्य समाधानों की तुलना में अधिक जटिल दिखता है, लेकिन जब आप इसे संभालते हैं तो उपयोग करने के लिए एक बहुत ही लचीला पैटर्न होता है, और बहुत अधिक विचार किए बिना संशोधित करना आसान होता है।

सबसे पहले, अपनी सीमा चुनें (जो लाइनें आप इसे लागू करना चाहते हैं)। मैं आमतौर पर अंक का उपयोग करता हूं (उदाहरण के maलिए पहली पंक्ति mbपर और दूसरे पर, लेकिन आप लाइन नंबर या दृश्य चयन का भी उपयोग कर सकते हैं), फिर निम्न कमांड का एक संशोधन दर्ज करें (वर्तमान में आपके उपयोग के मामले के लिए ट्वीक किया गया)

:let i=1|'a,'bg/^/s/^/\=i.". "/|let i=i+1

डीकंस्ट्रक्शन

:let i=1

यह iएक स्टार्ट वैल्यू के साथ वेरिएबल सेट करता है । आमतौर पर सूचियाँ 1 से शुरू होती हैं, इसलिए मैं i से 1 स्थापित कर रहा हूँ।

|

बार एक नया कमांड शुरू करता है

'a,'b

यह अगले कमांड की सीमा निर्धारित करता है। मैं मार्क से मार्क aतक जा रहा हूं b, जो आपकी सूची की पहली लाइन और आखिरी लाइन पर सेट होगा।

g/^/

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

Item some txt
other text

Item second item
whatever
Item third

और केवल इन लेबलों Itemको दूसरी लाइनों के सामने रखना और अनदेखा करना चाहते हैं, ( g/Item/या g/^Item/शाब्दिक आइटम पाठ को मानकर)

s/^/\=i.". "/

यह नियमित अभिव्यक्ति को अंजाम के साथ रेखा के आरंभ को बदलने के लिए निष्पादित करता iहै .। आम तौर पर आप इसे कुछ भी कर सकते हैं ( Itemउदाहरण के लिए, लेबल को नंबर के साथ बदलें )।

|let i=i+1

भले ही बार एक नई कमांड शुरू करता है, लेकिन यह ग्लोबल कमांड पूरा होने के बाद ग्लोबल कमांड के भीतर चलने के लिए दूसरी कमांड सेट करता है। iअगली पंक्ति को जी द्वारा संसाधित करने से पहले हम परिणाम बढ़ाते हैं । यहाँ लचीलापन का एक और स्थान है। I का संशोधन कुछ भी हो सकता है (2 से वृद्धि, एक फ़ंक्शन को कॉल करें जो फाइबोनैचि अनुक्रम के अगले तत्व को उत्पन्न करता है, जो भी हो)।


7

सभी पंक्तियों में संख्याएँ जोड़ें

इसका उपयोग :%!nl -baया :%!cat -nकमांड करना संभव है जो सभी लाइनों में लाइन नंबर जोड़ देगा।

विंडोज पर, आपको Cygwin / MSYS / SUA इंस्टॉल करना होगा।

चयनित पंक्तियों में संख्याएँ जोड़ें

केवल चयनित लाइनों के लिए संख्याओं को जोड़ने के लिए, कृपया उन्हें दृश्य मोड ( vऔर कर्सर) में चुनें, फिर जब समाप्त हो जाए - कमांड निष्पादित करें: :%!nl(रिक्त लाइनों को अनदेखा करें) या :%!cat -n(रिक्त लाइनें शामिल)।

का प्रारूपण

अतिरिक्त रिक्त स्थान को निकालने के लिए, उन्हें दृश्य ब्लॉक ( Ctrl+ v) में चुनें और उन्हें हटा दें ( x)।

कुछ अक्षर (जोड़ने के लिए ., :, )संख्या के बाद), उन्हें दृश्य ब्लॉक (में चयन Ctrl+ v), तो (चरित्र संलग्न A, चरित्र टाइप करें, फिर साथ समाप्त Esc)।


2
यह प्रश्न में दिए गए स्वरूपण के समान नहीं है। हालांकि, मुझे समाधान की सादगी पसंद है।
कार्ल यंगवे लर्वग

@ KarlYngveLervåg धन्यवाद, जवाब में शामिल किया।
केनोरब

5

रोमन के उत्तर का एक संशोधन :

:%s/^\(\d\+\. \)\?/\=line('.').". "

यह सिर्फ लाइन नंबर नहीं जोड़ेगा , यह पहले से मौजूद लाइन नंबर को भी बदल देगा । यदि आपने एक लाइन मध्य-मार्ग में डाली है, तो यह अपेक्षा के अनुसार सब कुछ ठीक कर देगा।

इसके बाद किसी भी संख्या को बदलकर यह काम करता है। और एक नए नंबर के साथ लाइन की शुरुआत में एक स्थान। यह स्पष्ट रूप से टूट जाएगा यदि आपके पास एक पंक्ति है जो पहले से ही इस पैटर्न से शुरू होती है, इसलिए विचार के साथ उपयोग करें।

जोड़ा गया भाग:

  • ^ - लाइन की शुरुआत
  • \( - नया उपसमूह शुरू करें
  • \d\+ - एक या अधिक बार एक अंक का मिलान करें
  • \. - एक बिंदु ( .) और एक स्थान का मिलान करें
  • \) - अंत उपसमूह
  • \? - समूह को वैकल्पिक बनाएं, ताकि यह पहले की तरह काम करे जैसे कि इस लाइन पर अभी तक कोई संख्या नहीं है।

बोनस संकेत: लाइन नंबरों
को हटाने के लिए, आप उसी भाग का उपयोग कर सकते हैं जिसमें रेपल्स भाग खाली है:

:%s/^\(\d\+\. \)\?//

5
I1. <esc>^qqyWjP^<C-a>q

यह पहली दो पंक्तियों की संख्या है, और आप @qसंख्या के बाद की पंक्तियों (या पूर्व प्रकार को दबा सकते हैं । 18@qयदि आप कुल 20 पंक्तियों की संख्या चाहते हैं)।

स्पष्टीकरण:

I1. <esc>  Number the first line
hqq        Go back to the start of the line and start recording a macro
yWjP       Copy the line number to the next line
^<C-a>     Increment the next line's line number
q          Finish recording

इसका लाभ यह है कि इसे किसी भी बाहरी कमांड की आवश्यकता नहीं है, जो कि यदि आप विंडोज पर विम के साथ काम कर रहे हैं, उदाहरण के लिए।


टाइप करने के बाद 1. <esc>hआप दूसरे कॉलम पर हैं, पहले कॉलम पर नहीं। मैं इसके hसाथ प्रतिस्थापित करूंगा 0, जिसके बाद मुझे लगता है कि आपका समाधान बहुत अच्छा होना चाहिए।
कार्ल यंगवे लर्वग

@ KarlYngveLervåg वूप्स, वह एक टाइपो था। धन्यवाद, इसे ठीक किया।
डोरकनॉब

कोई दिक्कत नहीं है। हालाँकि, आपने अभी भी स्पष्टीकरण को अपडेट नहीं किया है। इसके अलावा: कई कीबोर्ड पर, ^टाइपिंग संयोजनों की अनुमति देने के लिए दूसरे वर्ण की प्रतीक्षा करता है ^a -> â। मैं अभी भी इसके सबसे अच्छे समाधान से सहमत हूं, लेकिन मुझे लगता है कि इसका भी उल्लेख किया जाना चाहिए।
कार्ल यंगवे लर्वग

3

मुझे लगता है कि चुना गया उत्तर सबसे अच्छा है, लेकिन विविधता के क्षेत्र में, मैं एक बाहरी कार्यक्रम का उपयोग करके एक विकल्प पेश करूंगा:

:%!cat -n

यह %बाहरी प्रोग्राम के माध्यम से आपके पूरे बफ़र को फ़िल्टर करेगा ( catजहाँ द्वारा चिह्नित किया गया है ) , जहाँ -nध्वज एक पंक्ति संख्या के साथ इनपुट की प्रत्येक पंक्ति को प्रस्तुत करता है।

यह, निश्चित रूप से, यह आवश्यक है कि आपने catस्थापित किया है, जो (शायद) सभी यूनिक्स जैसी प्रणालियों के लिए सच है।

की जाँच करें :help :range!बाहरी प्रोग्राम के माध्यम से फ़िल्टरिंग के बारे में अधिक जानकारी के लिए।


1
मुझे पता है कि पूछने वाला विंडोज पर जीवीएम का उपयोग कर रहा है, इसलिए यह समाधान शायद वहां काम नहीं करेगा। हालाँकि, मुझे लगता है कि यह अभी भी दूसरों को इससे सीखने का कुछ अवसर प्रदान करता है।
तोमकाडो

यदि आपने msysgitअपने PATH (IIRC यह एक इंस्टॉल विकल्प है) को स्थापित और जोड़ा है, तो यह समाधान विंडोज पर भी काम करना चाहिए।
मार्टिन टूरनोइज

4
cat -nPOSIX नहीं है, लेकिन nlयह एक बेहतर विकल्प हो सकता है।
मूरू

2

एक बिट हैकिश सॉल्यूशन निम्नलिखित हो सकता है (सब कुछ <और> के बीच में लिखा हुआ है Ctrl+ दबाने के बाद डाला जाना चाहिए v):

:%normal :redir @"<Enter>:-=<Enter>:redir END<Enter>I<C-R>".<Tab><Esc>kdd

डीकंस्ट्रक्शन

:%normal {commands}

रेंज द्वारा निर्दिष्ट प्रत्येक लाइन पर सामान्य मोड कमांड चलाता है, इस मामले में प्रत्येक पंक्ति

:redir @"

पूर्व कमांड द्वारा किए गए प्रत्येक आउटपुट को अनाम बफ़र पर पुनर्निर्देशित करता है।

:.=

एक पूर्व कमांड है जो वर्तमान लाइन संख्या (दुर्भाग्य से पूर्ववर्ती नई रेखा के साथ) को आउटपुट करती है

:redir END

अनाम बफ़र पर पुनर्निर्देशन रोकता है

I<C-R>".<Tab><Esc>

अनाम बफ़र की सामग्री सम्मिलित करता है a। और प्रत्येक पंक्ति के सामने एक टैब और डालें मोड से बाहर निकलता है।

kdd

एक पंक्ति ऊपर जाती है और उस नई पंक्ति को निकालती है जिसका परिणाम है: = = कमांड।

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