কিভাবে একটি ফাইল স্থায়ী লাইন নম্বর যুক্ত করবেন?


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সম্ভবত এই কাজের জন্য হাতিয়ার। তবে আমি উইন্ডোজ (দীর্ঘশ্বাস) এ আছি।
রোব্লগিক

ইতিমধ্যে এখানে উত্তর দেওয়া হয়েছে , কিছু মনে করবেন না :)
রোব্লগিক

1
সম্ভবত .. না এটি আরও সাধারণ?
মুড়ু

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

3
ভাল, আমি অনুমান করি যে পোস্টটি "স্থায়ী" ওটি ব্যবহার করে এটি নির্দেশ করে যে বাফারটি সংশোধন করতে হবে এবং সংখ্যাগুলি কোনও খাঁটি দৃশ্যমান জিনিস নয় (আপনার মতো) same উইন্ডোজে জিভিআইএম নির্দিষ্ট করার কারণ হ'ল বাহ্যিক ইউটিলিটিগুলি এড়ানো catবা যেমন nl, সংখ্যা লাইন করতে পারে তবে এগুলি সাধারণত উইন্ডোজে পাওয়া যায় না (যেমন ওপি তাদের মন্তব্য থেকে বোঝায় awk)। শীর্ষ দুটি সমাধান বিশুদ্ধ Vim হয়। শেষ অবধি, সমস্ত লাইন বনাম একটি প্যারা কেবলমাত্র ব্যাপ্তি নির্বাচনের বিষয়। স্পষ্টত কোনও বড় বিষয় নয়।
মুরু

উত্তর:


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()

প্রতিস্থাপন অংশে একটি এক্সপ্রেশন ব্যবহার করা খুব শক্তিশালী এবং এফডব্লিউআইডাব্লু স্ক্রিপ্টে প্রবেশের একটি খুব ভাল পয়েন্ট।


আমি কীভাবে এই খুব দরকারী কমান্ডটি ভিএমআরসি-র কীম্যাপে যুক্ত করতে পারি?
মহাজাগতিক

প্রতিস্থাপনের জন্য :help sub-replace-expression
ভিআইএম

9

ভিম ম্যাক্রোগুলি সম্পর্কে একটি সুন্দর বিষয় হ'ল তারা পুনরাবৃত্তি করতে পারে (তারা নিজেরাই প্রার্থনা করতে পারে):

  1. রেজিস্টার সাফ করুন: qqq
  2. প্রথম লাইনে নম্বর যুক্ত করুন: ggI1.(স্থানটি ভুলে যাবেন না!)
  3. লাইনের শুরুতে ফিরে যান এবং ম্যাক্রো রেকর্ডিং শুরু করুন: 0qq
  4. নম্বরটি অনুলিপি করুন: yW
  5. একটি রেখা নীচে সরান এবং নম্বর পেস্ট করুন: +P
  6. লাইনের শুরুতে ফিরে যান এবং সংখ্যাটি বৃদ্ধি করুন: 0<c-a>
  7. লাইনের শুরুতে ফিরে যান (যাতে ডাবল ফিগার হয়ে গেলে ম্যাক্রোটি ভেঙে যায় না!): 0
  8. ম্যাক্রো একবার কল করুন, এটি পুনরাবৃত্তি করতে। এই মুহুর্তে, এখনও আছে, রেজিস্টার কুই কিছুই তাই কিছুই ঘটবে: @q
  9. ম্যাক্রো সংরক্ষণ করুন: q
  10. ম্যাক্রোকে আরও একবার কল করুন এবং স্পার্কগুলি উড়তে দেখুন !: @@

ম্যাক্রো তারপরে ফাইলটির শেষ না হওয়া পর্যন্ত নিজেকে চালিত করা চালিয়ে যাবে।

আপনি অনুরূপ অন্যান্য প্রচুর সমস্যার জন্য পুনরাবৃত্ত ম্যাক্রো ট্রিক ব্যবহার করতে পারেন, তাই সচেতন হওয়া ভাল।

আপনি যদি কোনও কারণে পুনরাবৃত্ত ম্যাক্রো ব্যবহার করতে না চান তবে আপনি 1 এবং 8 পদক্ষেপ বাদ দিতে পারেন এবং একাধিকবার ম্যাক্রো চালানোর জন্য একটি গণনা ব্যবহার করতে পারেন, যেমন 100 বার 100@qম্যাক্রো চলবে q


1
শক্তিশালী জিনিস, আমি আপনার প্রভুত্বের কাছে নত। ম্যাক্রোগুলি আমার কাছে কালো যাদুর মতো ...
রোব্লগিক

1
@ropata, একটি ম্যাক্রো হ'ল (বেশিরভাগ) সাধারণ মোড কমান্ডের একটি ক্রম।
রোমেনেল

1
@romainl আমি কী - স্ট্রোকের ক্রম হিসাবে এটি ভাবা ভাল বলে মনে করি ।
সমৃদ্ধ

2
@ রিচ, এটি প্রাক্তন কমান্ডগুলি সহ অনেক কিছুর ক্রম হতে পারে।
রোমেনেল

2
@ রোমেনল হ্যাঁ, এজন্যই আমি এটিকে কীস্ট্রোক হিসাবে ভাবা ভাল বলে মনে করি। এটি কীবোর্ডে ঠিক কী টাইপ করে তা খেলায় (যেমনটি আপনি যেমন বলতে চান, প্রাক্তন কমান্ডগুলি), যেন আপনি নিজে নিজে এগুলি টাইপ করেছেন।
ধনী

7

আমি এই জাতীয় কাজগুলি সম্পাদন করতে vim গ্লোবাল কমান্ডটি ব্যবহার করতে চাই। এটি কোনও রেখার শুরুতে পুনরাবৃত্তি যুক্ত করতে বা পাঠ্যে একটি প্রতীক পরিবর্তন করতে প্রযোজ্য। এটি অন্যান্য সমাধানগুলির চেয়ে আরও জটিল দেখায়, তবে আপনি যখন এটি ব্যবহার করেন তখন ব্যবহার করার জন্য এটি বেশ নমনীয় প্যাটার্ন এবং অনেক চিন্তাভাবনা ছাড়াই পরিবর্তন করা সহজ।

প্রথমে আপনার ব্যাপ্তিটি বেছে নিন (কোন লাইনগুলি আপনি এটি প্রয়োগ করতে চান)। আমি সাধারণত চিহ্ন ব্যবহার করি (উদাহরণস্বরূপ maপ্রথম লাইনে এবং mbদ্বিতীয়টিতে, তবে আপনি লাইন নম্বর বা ভিজ্যুয়াল নির্বাচনও ব্যবহার করতে পারেন), তারপরে নিম্নলিখিত কমান্ডটির একটি পরিবর্তন লিখুন (বর্তমানে আপনার ব্যবহারের ক্ষেত্রে টুইঙ্ক করা হয়েছে)

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

বিনির্মাণ

:let i=1

এটি iএকটি প্রারম্ভিক মান সহ ভেরিয়েবল সেট আপ করে । সাধারণত তালিকাগুলি 1 দিয়ে শুরু হয়, তাই আমি 1 এ সেট করছি।

|

বারটি একটি নতুন কমান্ড শুরু করে

'a,'b

এটি পরবর্তী কমান্ডের ব্যাপ্তি নির্ধারণ করে। আমি চিহ্ন থেকে যাচ্ছি aচিহ্ন b, যা প্রথম লাইন এবং আপনার তালিকার শেষ লাইনটি সেট করা যাবে।

g/^/

এটি বিশ্বব্যাপী আদেশ। এটি প্রদত্ত নিয়মিত অভিব্যক্তির জন্য ফাইলটি (বা পরিসীমা) অনুসন্ধান করে এবং মিলিত প্রতিটি লাইনে কমান্ডের বাকী অংশটি কার্যকর করে । আমি "লাইনের শুরু" অনুসন্ধান করে প্রতিটি লাইনের সাথে মিল করছি। আপনি যদি পাঠ্য মত

Item some txt
other text

Item second item
whatever
Item third

এবং কেবলমাত্র এই লেবেলগুলির সামনে রাখতে Itemএবং অন্যান্য লাইনগুলিকে অগ্রাহ্য করতে g/Item/বা করতে বা g/^Item/তার পরিবর্তে (আক্ষরিক আইটেমের পাঠ্যটি ধরে নেওয়া) চাই

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

এটি রেখাটির প্রারম্ভকে ia দিয়ে কঙ্কেনেটেড মানের সাথে প্রতিস্থাপন করতে নিয়মিত অভিব্যক্তি কার্যকর করে .। সাধারণত আপনি যে কোনও কিছুতে এটি করতে পারেন ( Itemউদাহরণ হিসাবে উদাহরণ সহ লেবেলটি প্রতিস্থাপন করুন )।

|let i=i+1

যদিও বারটি একটি নতুন কমান্ড শুরু করে, এটি বিশ্বব্যাপী সম্পূর্ণ হওয়ার পরে পরিবর্তে গ্লোবাল কমান্ডের মধ্যে চালানোর জন্য একটি দ্বিতীয় কমান্ড সেট করে। iপরবর্তী লাইনটি জি দ্বারা প্রক্রিয়া করার আগে ফলাফলটি আমরা বর্ধিত করি । এখানে নমনীয়তার আরেকটি জায়গা। আমি পরিবর্তনটি যে কোনও কিছু হতে পারে (2 দ্বারা বৃদ্ধি, একটি ফাংশন কল করুন যা ফিবোনাকী ক্রমের পরবর্তী উপাদান তৈরি করে, যাই হোক না কেন)।


7

সমস্ত লাইনে সংখ্যা যুক্ত করুন

এটি ব্যবহার করা সম্ভব :%!nl -baবা :%!cat -nকমান্ডগুলি যা সমস্ত লাইনে লাইন নম্বর যুক্ত করবে।

উইন্ডোজে আপনার সাইগউইন / এমএসওয়াইএস / এসইউএ ইনস্টল করা উচিত।

নির্বাচিত লাইনে সংখ্যা যুক্ত করুন

কেবলমাত্র নির্বাচিত লাইনের জন্য সংখ্যা যুক্ত করতে, দয়া করে ভিজ্যুয়াল মোডে ( vএবং কার্সারগুলি) এগুলি নির্বাচন করুন , তারপরে শেষ হয়ে গেলে - কমান্ডটি সম্পাদন করুন: :%!nl(ফাঁকা রেখাগুলি উপেক্ষা করুন) বা :%!cat -n(ফাঁকা লাইন অন্তর্ভুক্ত)।

বিন্যাস করা

অতিরিক্ত স্পেসগুলি সরাতে, তাদের ভিজ্যুয়াল ব্লক ( Ctrl+ v) এ নির্বাচন করুন এবং সেগুলি ( x) সরিয়ে দিন ।

কিছু অক্ষর (সংযোজন করতে ., :, )সংখ্যা পরে) তাদের চাক্ষুষ ব্লক (ইন নির্বাচন Ctrl+ + v), তারপর (চরিত্র সংযোজন A, চরিত্র টাইপ করুন, তারপর সঙ্গে শেষ Esc)।


2
এটি প্রশ্নের মধ্যে যেমন ফরম্যাটিং দেয় তেমন দেয় না। তবে আমি সমাধানটির সরলতা পছন্দ করি।
কার্ল ইংভে লেরভেগ

@ কার্লইংভেলেভের্গ ধন্যবাদ, উত্তরে এটি অন্তর্ভুক্ত করেছেন।
কেনারব

5

রোমেনেলের উত্তরের একটি পরিবর্তন :

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

এটি কেবল লাইন নম্বর যুক্ত করবে না , এটি উপস্থিত থাকা লাইন নম্বরগুলি এটি ইতিমধ্যে রয়েছে এমন প্রতিস্থাপন করবে । এর মধ্যে, যদি আপনি মাঝখানের কোনও লাইন sertedোকান থাকেন তবে এটি প্রত্যাশার মতো সবকিছুকে নতুন করে দেবে।

এটি a এর পরে যে কোনও সংখ্যা প্রতিস্থাপন করে কাজ করে। এবং নতুন সংখ্যার সাথে লাইনের শুরুতে একটি স্থান। এটি ইতিমধ্যে ভঙ্গ হবে যদি আপনার কাছে ইতিমধ্যে এই প্যাটার্ন দিয়ে শুরু হওয়া একটি লাইন থাকে, তাই চিন্তাভাবনা সহ ব্যবহার করুন।

যুক্ত অংশ:

  • ^ - লাইন শুরু
  • \( - নতুন সাবগ্রুপ শুরু করুন
  • \d\+ - এক বা একাধিক সংখ্যার সাথে মেলে
  • \. - একটি বিন্দু ( .) এবং একটি স্পেস মিলান
  • \) - শেষ উপগোষ্ঠী
  • \? - গোষ্ঠীটি optionচ্ছিক করুন, যাতে এটি এই লাইনে কোনও নম্বর না থাকলে আগের মতো কাজ করে।

বোনাস ইঙ্গিত:
জন্য অপসারণ লাইন সংখ্যা, আপনি একই প্যাটার্ন repalce অংশ দিয়ে খালি ব্যবহার করতে পারেন:

:%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, যার পরে আমি মনে করি আপনার সমাধান খুব ভাল হওয়া উচিত।
কার্ল ইংভে লেরভেগ

@ কার্লইংভেলেভের্গ ওফস, এটি টাইপো ছিল। ধন্যবাদ, এটি স্থির করুন।
ডোরকনব

সমস্যা নেই. তবে আপনি এখনও ব্যাখ্যাটি আপডেট করেননি। এছাড়াও: অনেকগুলি কীবোর্ডে, ^টাইপিংয়ের মতো সংমিশ্রণের জন্য দ্বিতীয় অক্ষরটির জন্য অপেক্ষা করা হয় ^a -> â। আমি এখনও এর সর্বোত্তম সমাধানটিকে সম্মত করছি, তবে আমি মনে করি এটির পাশাপাশি উল্লেখ করা উচিত।
কার্ল ইংভে লেরভেগ

3

আমি মনে করি নির্বাচিত উত্তরটি সেরা, তবে বিভিন্ন ধরণের ক্ষেত্রে, আমি একটি বাহ্যিক প্রোগ্রাম ব্যবহার করে একটি বিকল্প প্রস্তাব করব:

:%!cat -n

এটি %বাহ্যিক প্রোগ্রামের মাধ্যমে আপনার পুরো বাফারকে (যেমন হিসাবে চিহ্নিত করা হয়েছে ) ফিল্টার করবে cat, যেখানে -nপতাকাটি প্রতিটি লাইনটিকে একটি লাইন সংখ্যার সাহায্যে ইনপুটটির পূর্ববর্তী করে দেয় ।

এটি অবশ্যই আপনার catইনস্টল করা আবশ্যক, যা (সম্ভবত) সমস্ত ইউনিক্স-মতো সিস্টেমের ক্ষেত্রে সত্য।

:help :range!বাহ্যিক প্রোগ্রামগুলির মাধ্যমে ফিল্টারিং সম্পর্কিত আরও বিশদ পরীক্ষা করে দেখুন।


1
আমি বুঝতে পারি যে প্রশ্নকারী উইন্ডোজে জিভিম ব্যবহার করছে, সুতরাং সম্ভবত এই সমাধানটি সেখানে কাজ করবে না। তবে আমি মনে করি এটি এখনও অন্যদের থেকে এটি শেখার কিছু সুযোগ সরবরাহ করে।
টমমকডো

যদি আপনি এটি ইনস্টল msysgitকরে আপনার পাঠাতে যোগ করেন (আইআইআরসি এটি একটি ইনস্টল বিকল্প), এই সমাধানটি উইন্ডোজটিতেও কাজ করা উচিত।
মার্টিন টর্নয়েজ

4
cat -nপসিক্স নয়, তবে nlতাই, এটি আরও ভাল বিকল্প হতে পারে।
মুরু

2

কিছুটা হ্যাকিশ সমাধান নিম্নলিখিত হতে পারে (<এবং> এর মধ্যে লিখিত সমস্ত কিছুই Ctrl+ টিপানোর পরে sertedোকানো হবে v):

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

বিনির্মাণ

:%normal {commands}

সীমা দ্বারা নির্দিষ্ট প্রতিটি লাইনে স্বাভাবিক মোড কমান্ড চালায়, এক্ষেত্রে প্রতিটি লাইন

:redir @"

প্রাক্তন কমান্ড দ্বারা তৈরি প্রতিটি আউটপুট নামবিহীন বাফারে পুনঃনির্দেশিত করে।

:.=

হ'ল একটি প্রাক্তন কমান্ড যা বর্তমান লাইন নম্বরকে ছাড়িয়ে যায় (দুর্ভাগ্যক্রমে পূর্ববর্তী নিউলাইন সহ)

:redir END

নামবিহীন বাফারে পুনর্নির্দেশ বন্ধ করে

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

একটি সহ নামবিহীন বাফার সামগ্রী সন্নিবেশ করান। এবং প্রতিটি লাইনের সামনে একটি ট্যাব এবং সন্নিবেশ মোড থেকে প্রস্থান করে।

kdd

এক লাইন উপরে যায় এবং নিউলাইনটি সরিয়ে দেয় যা:: = কমান্ডের ফলাফল।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.