প্রতিটি লাইনে কীভাবে 11 বার অনুলিপি করবেন, 2-2 থেকে প্রতিটি লাইনে শেষ "1" বৃদ্ধি করুন


9

আমার একটি ফাইলে বেশ কয়েকটি লাইন রয়েছে এবং আমি প্রতিটি লাইন 11 বার অনুলিপি করতে চাই (প্রতিটি লাইনকে 12 লাইনে রূপান্তর করে), এবং প্রতিটি লাইনে শেষ "1" বর্ধন করি যাতে 12 রেখার মধ্য দিয়ে "1" থাকে 12 ", যেখানে" 1 "শুরুতে ছিল। প্রতিটি লাইনে "1" এর অন্যান্য ঘটনাও ঘটতে পারে তবে আমি "1" বাড়াতে চাই প্রতিটি লাইনে সর্বদা সর্বশেষ ঘটনা হবে। এটি দেখার আরেকটি উপায় হ'ল সর্বশেষ "1" সর্বদা "/ nt /" - এর পরে "/ এনটি / 1" এর পরে থাকে (এবং এটি সর্বদা প্রতিটি লাইনে "/ এনটি / 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
বাহ, দুর্দান্ত এক-লাইন কমান্ড। আমার মনে আছে যে কয়েক সপ্তাহ আগে আমি জিজ্ঞাসা করা প্রথম প্রশ্নের জন্য আপনি একটি মার্জিত এক-লাইন সমাধানও পেয়েছিলেন। খুব সুন্দর কাজ। আপনাকে অনেক ধন্যবাদ. এছাড়াও, আমি অনুমান করছি যে এটি _vimrc ফাইলে রাখার একটি উপায় রয়েছে যাতে আমি পুরো লাইনটি উপরে টাইপ না করে (বা পূর্ববর্তী কমান্ডের তালিকায় স্ক্রোল করতে না পেরে) একটি সহজে মনে রাখা সহজ কমান্ড বা ফাংশন সম্পাদন করতে পারি, তবে কীভাবে এটি করা যায় তা জানতে আমি এখনও ভিভিআরসিআর সিন্টেক্সের সাথে যথেষ্ট পরিচিত নই।
وړওয়াসিরিসওয়েলবা

10

আপনি এই দ্বারা এটি করতে পারে

  1. একটি ম্যাক্রো রেকর্ডিং, তারপর
  2. globalপ্রাক্তন কমান্ড ব্যবহার করে ফাইলের প্রতিটি লাইনের জন্য ম্যাক্রো এন সংখ্যা নির্বাহ করতে ।

ম্যাক্রো রেকর্ডিংয়ের পরে, রেকর্ডিংয়ের সময় করা পরিবর্তনগুলি পূর্বাবস্থায় ফেরান, বা প্রথম লাইনের জন্য 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-একটি হাইলাইট সবকিছু যোগ করার পরিবর্তে সঙ্গে প্রাথমিকভাবে একটি সমস্যা কারণ আমি উইন্ডোজে gVim ব্যবহার করছি ... কিন্তু আমি একটি দ্রুত অনুসন্ধান করেনি এবং এই থ্রেড পাওয়া যায় নি - stackoverflow.com/questions/289681/... - যেখানে আমি _vimrc এ nnoremap <kPlus> <CQL nnoremap <kMinus> <Cx> রাখার পরামর্শটি ব্যবহার করেছি যাতে আমি যোগ করতে এবং বিয়োগের জন্য "+" এবং "-" কী ব্যবহার করতে পারি। এছাড়াও, গ্লোবাল কমান্ডটি হওয়া দরকার: আমার জন্য জি // সাধারণ 11 @ এ, তবে এটি সহজেই সন্ধান করা হয়েছিল। ধন্যবাদ!
قابلওয়াসেরিসেওয়েলবা

6

দুটি উপায়:

একটি ম্যাক্রো ব্যবহার করুন!

দিয়ে শুরু

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

প্রথম লাইনে আপনার কার্সার দিয়ে

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

যা আছে:

qq কিউ রেজিস্ট্রারে ম্যাক্রো রেকর্ডিং শুরু করুন

yyp বর্তমান লাইন ইঙ্ক করুন এবং এটি নীচে আটকান

$?\d<CR> লাইনের শেষ প্রান্তে যান এবং পিছনের দিকে তাকানো প্রথম সংখ্যাটি সন্ধান করুন

<Ctrl-a> সংখ্যা বৃদ্ধি

q ম্যাক্রো রেকর্ডিং বন্ধ করুন।

এটি আপনাকে সাথে ছেড়ে দেয়:

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

দ্বিতীয় লাইনে কার্সার সহ। এই ম্যাক্রোটিকে পছন্দসইভাবে যতবার পুনরাবৃত্তি করুন (উদাহরণস্বরূপ, এটি 10 ​​@ কিউ দিয়ে দশবার পুনরাবৃত্তি করুন)। আপনি যদি প্রতিটি লাইনের জন্য এই প্রক্রিয়াটি স্বয়ংক্রিয় করতে চান তবে প্রতিটি লাইন জুড়ে এটি বিশ্বব্যাপী চালিত করুন:

:g//normal 11@q

বিকল্পভাবে, ভিএম এর একটি নতুন সংস্করণ সহ: আপনি যে লাইনটি চান তা বার বার আটকে দিন, ভিজ্যুয়াল ব্লক আপনি যে অঙ্কটি বৃদ্ধি করতে চান তা নির্বাচন করুন এবং টিপুন g <Ctrl-a>। এটি আপনার ইচ্ছা অনুসারে ভিজ্যুয়াল ব্লকের সমস্ত সংখ্যা বাড়িয়ে তুলবে। তবে এটি আরও ম্যানুয়াল প্রক্রিয়া।


1
দুর্দান্ত, আমি g <c-a>উপায় সম্পর্কে জানতাম না know ভাগ করে নেওয়ার জন্য ধন্যবাদ.
কেবিএ মনিকার সাথে দাঁড়িয়ে আছে

1
@ ফ্রাগলমনকি আপনার উত্তরের প্রথম অংশটি উপরের মত একই, তবে তবুও আপনাকে ধন্যবাদ। দ্বিতীয় অংশটি, আমি মনে করি না যে আমার পক্ষে কাজ করে (যদি না আমি কিছু ভুল করে থাকি), সুতরাং আমি অবশ্যই সঠিক সংস্করণটি ব্যবহার করব না।
وړওয়াসিরিসওয়েলবা

5

আমি এর মতো একটি শট কাজের জন্য ম্যাক্রোগুলি ব্যবহার করা সবচেয়ে সহজ বলে মনে করি। কেবলমাত্র qনিবন্ধকের নাম সহ একটি ম্যাক্রো রেকর্ডিং শুরু করুন এবং একবার টাস্কটি করুন। আমি এখানে একটি পুনরাবৃত্তিযোগ্য টাস্কটি দেখছি:

  • লাইনটি নির্বাচন করুন
  • ঝাঁকি মারিয়া টানা
  • পেস্ট করুন (আপনাকে পরের লাইনে রাখবে)
  • লাইনের শেষে যান
  • একটি শব্দ ফিরে যান
  • এক এক দ্বারা বৃদ্ধি

এখন aসাধারণ মোডে নিবন্ধকরণের জন্য প্রয়োজনীয় কীস্ট্রোকগুলি রেকর্ড করুন:

qayyp$b<c-a>.

11 বার ম্যাক্রো কার্যকর করা কি এক লাইনের জন্য সঠিক ফলাফল দেয় কিনা তা পরীক্ষা করতে আবার লাইনটি মুছুন:

11@a

এটা করে! সুতরাং আবার পূর্বাবস্থায় ফিরে আসুন এবং দ্বিতীয় ম্যাক্রোতে পুরো প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে চলুন b:

qb11@aj

এখন আপনি @bফাইলটির শেষ অবধি কার্যকর করতে পারবেন এবং এটি আপনার পছন্দসই আউটপুট তৈরি করবে। এটি জটিল শোনায় তবে আপনি সাধারণত সম্পাদনার ধরণে অভ্যস্ত হন না isn't


আমি কিছু ভুল করছি কিনা তা নিশ্চিত নই, তবে এটি কাজ করছে বলে মনে হচ্ছে না। আপনি যা লিখেছেন তা আমি অনুসরণ করেছি, তবে সম্ভবত আমি কিছু ভুল বুঝেছি বা কিছু ঠিকঠাকভাবে কার্যকর করি নি। (আমি লাইনের প্রথম সংখ্যাটি বর্ধিত করছি, লাইনের শেষ সংখ্যা নয়।) উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ।
সক্ষমওয়াসেরিসওয়েলবা

3
আমি মনে করি প্রথম ম্যাক্রো হওয়া উচিত qaVyp$b<c-a>। বা আরও ভাল, ঠিক qayyp$b<c-a>
কার্ল ইঙ্গভে লেরভেগ

1
ধন্যবাদ, @ কার্লইংভেলেভের্গ, আপনি ঠিক বলেছেন, আমি ম্যাক্রো ঠিক করেছি।
কেবিএ মনিকার সাথে দাঁড়িয়ে আছে

2
আর্গ :( পুরোপুরি @ablewasiereisawelba হওয়ার জন্য ধন্যবাদ। আমি মনে করি qqyyp$?\d<CR><Ctrl-a>q@ ফ্রুগলমনকি দ্বারা @ ম্যাক্রো অনুমান করা হয়েছে এবং @ জাজাদবার্গ এটি শেষ সংখ্যাটি অনুসন্ধান করেছেন বলে আমি এটি সম্পূর্ণতার জন্য পরিবর্তন করব
কেবিএ মনিকার সাথে দাঁড়িয়ে আছে

2
@ কেবিএ আমি কেবল ভেবেছিলাম যে কেউ যদি আমার প্রশ্নের উত্তর দেওয়ার জন্য সময় এবং প্রচেষ্টা নেয় তবে আমি অন্তত তার সমাধানটি চেষ্টা করতে পারি - এমনকি যদি আমি ইতিমধ্যে অন্য কারও কাছ থেকে কার্যকরী সমাধান খুঁজে পেয়েছি। আমি আপনার প্রচেষ্টার প্রশংসা করি - এবং যদি এটি আপনাকে আরও ভাল বোধ করে তবে আপনি এখনও আমার থেকে কয়েক মাইল এগিয়ে। :)
সক্ষমওয়াসেরিসওয়েলবা

2

নিম্নলিখিত ম্যাক্রো সংরক্ষণ করুন এবং প্রতিটি লাইনের জন্য এটি ব্যবহার করুন:

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

অন্যান্য উত্তরের উপর প্রধান পার্থক্য হ'ল g<C-a>এটি একটি কলাম নির্বাচনের ব্যবহার করে যা প্রতিটি সংখ্যাকে আলাদা সংখ্যা দিয়ে বৃদ্ধি করে incre :help v_g_CTRL-Aআরও তথ্যের জন্য পরীক্ষা করুন। আমি \zsপ্যাটার্ন শুরুর অবস্থানটি নির্বাচন করতেও ব্যবহার করেছি , যেমন সন্ধানের পরে কার্সারটি থামবে।

দয়া করে মনে রাখবেন এটি কাজ করার জন্য আপনার ভিমের একটি সাম্প্রতিক সংস্করণ প্রয়োজন।


1
@ ফ্রগলমনকিও সেই প্রস্তাব দিয়েছে । এটি একটি দুর্দান্ত বৈশিষ্ট্য, যদিও এটি মোটামুটি সাম্প্রতিক (ভিএম স্ট্যান্ডার্ড অনুসারে), 7.4.754 সাল থেকে যা এখনও সমস্ত ডিস্ট্রোজে পাঠানো হয়নি।
কেবিএ মনিকার সাথে দাঁড়িয়ে আছে

এটি মিস করে দুঃখিত
ভিজিটর

1
@ ভিজিটর আমার সবেমাত্র জিভিআইএম .4.৪ রয়েছে তাই আমি মনে করি না যে আমি g<C-a>@ ফ্রুগলমনকিটি করতে পেরেছি এবং আপনি উল্লেখ করেছেন, তবে সাড়া দেওয়ার জন্য ধন্যবাদ। আমার নোট করা উচিত যে আপনার ম্যাক্রোটি চেষ্টা করার সময় - আমি g<C-a>অংশ নেওয়ার ঠিক আগে , এটি শেষ "1" অক্ষর নয় যা আমি বৃদ্ধির দিকে তাকিয়ে যা ব্লক-হাইলাইট হয়ে যায়, তবে পরিবর্তে এটি প্রথম "1" এর আগে চরিত্রটি "অক্ষর যা ব্লক-হাইলাইট হয়। (এছাড়াও, আমি মনে করি এটি হবে yy11pএবং 10jম্যাক্রোতে যেহেতু আমি ১১ টি লাইন যুক্ত করতে চাইছি - মোট ১২ টির জন্য)
সক্ষমওয়াসেরিসওয়েলবা

1
আপনার প্রতিক্রিয়ার জন্য ধন্যবাদ। আমি সেই অনুযায়ী উত্তর আপডেট করেছি। ব্যবহারের সিদ্ধান্ত নিয়েছে \zs, তবে আমি কেবল পাশাপাশি lপরে যুক্ত করতে পারলাম <CR>
Vitor থেকে

1
আপনার ভিএমআরসি তে সম্ভবত কিছু সেটিংস রয়েছে যা নিয়মিত অভিব্যক্তি অনুসন্ধানকে প্রভাবিত করে। ভিম দিয়ে শুরু করে আবার চেষ্টা করুন vim -u NONE। আমি সবেমাত্র এটি করেছি এবং এটি পুরোপুরি কাজ করে! আসলে, অনুসন্ধানটি প্রথম 1 টির সাথে মিলে যাওয়ার কোনও উপায় নেই কারণ এর জন্য পূর্ববর্তী স্ল্যাশ প্রয়োজন।
20:48
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.