प्रत्येक पंक्ति को 11 बार कॉपी कैसे करें, 2-12 से प्रत्येक पंक्ति में अंतिम "1" बढ़ाना


9

मेरे पास एक फ़ाइल में कई पंक्तियाँ हैं, और मैं प्रत्येक पंक्ति को 11 बार कॉपी करना चाहता हूं (प्रत्येक पंक्ति को 12 रेखाओं में बदलना), और प्रत्येक पंक्ति में अंतिम "1" बढ़ाना है ताकि 12 पंक्तियों में "1" हो जाए " 12 ", जहां" 1 "शुरू में था। प्रत्येक पंक्ति में "1" की अन्य घटनाएं हो सकती हैं, लेकिन "1" मैं वेतन वृद्धि करना चाहता हूं, प्रत्येक पंक्ति में हमेशा अंतिम घटना होगी। इसे देखने का एक और तरीका यह है कि अंतिम "1" हमेशा "/ nt /" के बाद होता है - जैसा कि "/ nt / 1" में होता है (और यह हमेशा प्रत्येक पंक्ति में "/ nt / 1" की एकमात्र घटना होगी) ।

इसलिए, उदाहरण के लिए, अगर मेरे पास:

1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah

मैं इसे चालू करना चाहता हूं:

1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...

मुझे पहले कमांड मिली थी:

:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor

इस उद्देश्य के लिए काम करता है, लेकिन मुझे प्रत्येक पंक्ति के लिए मैन्युअल रूप से इस कमांड को चलाना होगा, और प्रत्येक पंक्ति को स्वयं (या कॉपी-एंड-पेस्ट करना) टाइप करना होगा। क्या फ़ाइल में पहले से मौजूद लाइनें लेने का एक तरीका है, और बस एक कमांड चलाएं जो प्रत्येक पंक्ति को बारह में बदल दे, जिस तरह से मैंने वर्णित किया है?

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

जवाबों:


8

यहाँ एक प्रतिस्थापन है जो समस्या को हल करता है:

:%s/\(.*\)1\(.*\)/\=join(map(range(1, 12), 'submatch(1) . v:val . submatch(2)'), "\n")

प्रतिस्थापन प्रत्येक पंक्ति से मेल खाता है जिसमें "1" है और अंतिम "1" से पहले {c1}और बाद {c2}में पाठ को कैप्चर करता है । प्रत्येक मिलान किया लाइन के लिए, बारह एक से संख्या की सीमा {n}रहे हैं मैप किया प्रपत्र के बारह लाइनों बनाने के लिए {c1}{n}{c2}। बारह लाइनों का प्रत्येक समूह अपने संबद्ध, मूल रूप से मिलान वाली रेखा को बदल देता है।

देख लो :h sub-replace-expression


2
वाह, महान एक लाइन आदेश। मुझे याद है कि आपने कुछ हफ्ते पहले पूछे गए पहले प्रश्न के लिए एक सुरुचिपूर्ण एक-लाइन समाधान भी पाया था। बहुत अच्छा काम। आपका बहुत बहुत धन्यवाद। इसके अलावा, मैं अनुमान लगा रहा हूं कि इसे _vrcrc फाइल में डालने का एक तरीका है ताकि मैं ऊपर की पूरी लाइन टाइप किए बिना एक आसानी से याद रखने वाली कमांड या फंक्शन को निष्पादित कर सकूं (या पिछली कमांड की सूची में स्क्रॉल करने के लिए), लेकिन मैं अभी तक पर्याप्त नहीं हूँ कि यह कैसे करना है यह जानने के लिए _vrcrc सिंटैक्स के साथ।
सक्षमवाशीसेवाबा

10

आप ऐसा कर सकते हैं

  1. एक मैक्रो रिकॉर्डिंग, फिर
  2. फ़ाइल में प्रत्येक पंक्ति के लिए globalमैक्रो n संख्या को निष्पादित करने के लिए पूर्व कमांड का उपयोग करना ।

मैक्रो रिकॉर्ड करने के बाद, रिकॉर्डिंग करते समय किए गए परिवर्तनों को पूर्ववत करें, या पहली पंक्ति के लिए n + 1 अतिरिक्त रेखाएं होंगी, और लगातार लाइनों के लिए n

मैक्रो को aरजिस्टर में रजिस्टर करें

qayyp$?\d<CR><C-A>q

रजिस्टर में यह रिकॉर्ड a( qa...q) निम्नलिखित आदेश:

  • yyp: करंट लाइन को डुप्लिकेट करें
  • $: लाइन के अंत में जाएँ
  • ?\d<CR>: एक अंक के लिए पीछे की ओर खोजें
  • <C-A>: कर्सर द्वारा एक के तहत वृद्धि अंक

जब मैक्रो रिकॉर्ड किया जाता है, तो इसे रिकॉर्ड करने के दौरान किए गए परिवर्तनों को या तो हटा दें ( uuया मौजूदा लाइन को हटाकर dd)। फिर 11वैश्विक कमांड के साथ फ़ाइल में प्रत्येक पंक्ति के लिए मैक्रो (या किसी भी संख्या) बार दोहराएं :

:g//normal 11@a

2
इसने काम कर दिया! बहुत बढिया आपको धन्यवाद। मुझे शुरुआत में Ctrl-a को जोड़ने के बजाय सब कुछ हाइलाइट करने में समस्या थी, क्योंकि मैं विंडोज में gVim का उपयोग कर रहा हूं ... लेकिन मैंने एक त्वरित खोज की और इस धागे को पाया - stackoverflow.com/questions/289681/… - जहाँ मैं _vimrc में nnoremap <kPlus> <Ca> nnoremap <kMinus> <Cx> डालने के सुझाव का उपयोग किया ताकि मैं "+" और "-" कुंजियों को जोड़ने और घटाने के लिए उपयोग कर सकूं। इसके अलावा, वैश्विक आदेश की जरूरत है: जी // सामान्य 11 @ मेरे लिए, लेकिन यह आसानी से समझ में आया। धन्यवाद!
सक्षमवाशीसेवाबा

6

दो तरीके:

एक मैक्रो का उपयोग करें!

के साथ शुरू

1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah

पहली पंक्ति पर अपने कर्सर के साथ

qqyyp$?\d<CR><Ctrl-a>q
10@q

जो करता है:

qq Q रजिस्टर में मैक्रो रिकॉर्ड करना शुरू करें

yyp वर्तमान लाइन को यैंक करें, और इसे नीचे पेस्ट करें

$?\d<CR> पंक्ति के अंत में जाएं, और पीछे की ओर देख रहे पहले अंक को ढूंढें

<Ctrl-a> संख्या में वृद्धि

q मैक्रो रिकॉर्ड करना बंद करें।

यह आपको छोड़ देता है:

1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah

दूसरी लाइन पर कर्सर के साथ। बस इस मैक्रो को जितनी बार चाहें उतनी बार दोहराएं (उदाहरण के लिए, इसे 10 @ q के साथ दस बार दोहराएं)। यदि आप प्रत्येक पंक्ति के लिए इस प्रक्रिया को स्वचालित करना चाहते हैं, तो इसे प्रत्येक पंक्ति में विश्व स्तर पर निष्पादित करें:

:g//normal 11@q

वैकल्पिक रूप से, विम के नए संस्करण के साथ: जिस लाइन को आप कई बार चाहते हैं, उसे चिपकाएं, दृश्य ब्लॉक उस अंक का चयन करें जिसे आप बढ़ाना चाहते हैं, और दबाएं g <Ctrl-a>। यह दृश्य ब्लॉक में सभी संख्या में वृद्धि करना चाहिए जैसा कि आप चाहते हैं। हालांकि यह एक अधिक मैन्युअल प्रक्रिया है।


1
बहुत बढ़िया, मैं g <c-a>रास्ते के बारे में नहीं जानता था । साझा करने के लिए धन्यवाद।
kba

1
@fruglemonkey आपके उत्तर का पहला भाग ऊपर वाले के समान है, लेकिन फिर भी आपको धन्यवाद। दूसरा भाग, मुझे नहीं लगता कि मेरे लिए काम करता है (जब तक कि मैं कुछ गलत नहीं कर रहा हूं), इसलिए मुझे सही संस्करण का उपयोग नहीं करना चाहिए।
सक्षमवाशीसेवल्बा

5

मुझे इस तरह के एक-शॉट कार्यों के लिए मैक्रोज़ का उपयोग करना सबसे आसान लगता है। बस qरजिस्टर के नाम के साथ एक मैक्रो रिकॉर्ड करना शुरू करें और एक बार कार्य करें। मुझे यहां एक दोहराने योग्य कार्य दिखाई देता है:

  • लाइन का चयन करें
  • झटका
  • पेस्ट (अगली पंक्ति में आपको डालेंगे)
  • पंक्ति के अंत में जाएं
  • एक शब्द वापस जाओ
  • एक से बढ़ कर

अब aसामान्य मोड में, रजिस्टर करने के लिए आवश्यक कीस्ट्रोक्स रिकॉर्ड करें:

qayyp$b<c-a>.

यह परीक्षण करने के लिए फिर से लाइन हटाएं कि क्या मैक्रो को 11 बार निष्पादित करने से एक लाइन के लिए सही परिणाम मिलता है:

11@a

ऐसा होता है! तो फिर से पूर्ववत करें और दूसरी मैक्रो में पूरी प्रक्रिया को स्वचालित करें b:

qb11@aj

अब आप @bफ़ाइल के अंत तक निष्पादित कर सकते हैं और यह आपको इच्छित आउटपुट का उत्पादन करना चाहिए। यह जटिल लगता है, लेकिन यह वास्तव में एक बार नहीं है जब आप विशिष्ट संपादन पैटर्न के लिए उपयोग किए जाते हैं।


मुझे यकीन नहीं है कि मैं कुछ गलत कर रहा हूं, लेकिन यह काम नहीं कर रहा है। आपने जो लिखा, उसका मैंने अनुसरण किया, लेकिन शायद मैंने कुछ गलत समझा या कुछ ठीक से निष्पादित नहीं किया। (मैं लाइन की पहली संख्या बढ़ा रहा हूँ, पंक्ति की अंतिम संख्या नहीं।) उत्तर देने के लिए धन्यवाद।
२.३६ बजे

3
मुझे लगता है कि पहला मैक्रो होना चाहिए qaVyp$b<c-a>। या बेहतर, बस qayyp$b<c-a>
कार्ल यंगवे लर्वग

1
धन्यवाद, @ KarlYngveLervåg, आप सही हैं, मैंने मैक्रो को ठीक कर दिया है।
kba

2
Argh :( धन्यवाद पूरी तरह से @ablewasiereisawelba होने के लिए। मुझे लगता है कि मैक्रो qqyyp$?\d<CR><Ctrl-a>q@fruglemonkey और @jjaderberg द्वारा बेहतर है क्योंकि यह अंतिम संख्या खोजता है। मैं इसे पूर्णता के लिए बदल
दूंगा

2
@kba मैंने सिर्फ यह सोचा कि यदि किसी को मेरे प्रश्न का उत्तर देने के लिए समय और प्रयास लगता है, तो मैं कम से कम उसके समाधान की कोशिश कर सकता हूं - भले ही मुझे पहले से किसी और से काम करने का हल मिल गया हो। मैं आपके प्रयास की सराहना करता हूं - और अगर यह आपको कोई बेहतर महसूस कराता है, तो आप अभी भी मुझसे आगे हैं। :)
सक्षमवादिसावेलबा

2

निम्न मैक्रो सहेजें और प्रत्येक पंक्ति के लिए इसका उपयोग करें:

qqyy11p/\/\zs1<CR><C-v>10jg<C-a>q

अन्य उत्तरों पर मुख्य अंतर यह है कि यह g<C-a>एक स्तंभ चयन पर उपयोग करता है जो प्रत्येक पंक्ति को एक अलग संख्या के साथ बढ़ाता है। :help v_g_CTRL-Aअधिक जानकारी के लिए जाँच करें । मैंने \zsपैटर्न स्टार्ट स्थिति का चयन करने के लिए भी उपयोग किया है, जैसे कि खोज के बाद नंबर पर कर्सर रुक जाता है।

कृपया ध्यान दें कि आपको काम करने के लिए विम के हालिया संस्करण की आवश्यकता है।


1
@fruglemonkey ने यह भी प्रस्तावित किया था । यह एक अच्छी सुविधा है, हालांकि यह काफी हाल ही में (vim मानकों के अनुसार) है, 7.4.754 के बाद से जिसने अभी तक सभी डिस्ट्रो को शिप नहीं किया है।
kba

इसे याद किया
विटोर

1
@Vitor मेरे पास सिर्फ gVim 7.4 है, इसलिए मुझे नहीं लगता कि मैं g<C-a>उस @fruglemonkey को कर सकता हूं और आपने संदर्भित किया, लेकिन जवाब देने के लिए धन्यवाद। मुझे ध्यान देना चाहिए कि जब मैं मैक्रो की कोशिश कर रहा हूं - इससे पहले कि मैं g<C-a>भाग में आता हूं , यह अंतिम "1" चरित्र नहीं है जिसे मैं बढ़ाना चाह रहा हूं जो ब्लॉक-हाइलाइट हो जाता है, लेकिन इसके बजाय यह पहले "1" से पहले का चरित्र है। "चरित्र जो ब्लॉक-हाइलाइट हो जाता है। (इसके अलावा, मुझे लगता है कि यह yy11pऔर 10jमैक्रो में होगा, क्योंकि मैं 11 पंक्तियों को जोड़ना
चाह

1
आपकी प्रतिक्रिया के लिए धन्यवाद। मैंने उसी हिसाब से जवाब अपडेट किया है। का उपयोग करने का निर्णय लिया \zs, लेकिन मैं बस के lबाद बस के रूप में अच्छी तरह से जोड़ सकते हैं <CR>
विक्टर

1
संभवतः आपके vimrc में कुछ सेटिंग्स हैं जो नियमित अभिव्यक्ति खोज को प्रभावित करती हैं। इसे फिर से Vim से शुरू करने का प्रयास करें vim -u NONE। मैंने अभी किया है और यह पूरी तरह से काम करता है! वास्तव में, ऐसा कोई तरीका नहीं है कि खोज पहले 1 से मेल खाए, क्योंकि इसके लिए पूर्ववर्ती स्लैश की आवश्यकता होती है।
विटोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.