এন লাইনগুলি মুছুন 1 লাইন স্ক্রিপ্ট এড়িয়ে যান


10

আমি একটি বেসিক ভিম স্ক্রিপ্ট তৈরি করতে চাই যা কেবল এন লাইনগুলি মুছে ফেলে, 1 লাইন এড়িয়ে যায় এবং নথির শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করে। আমি নির্দিষ্ট মিলগুলির বিষয়ে চিন্তা করি না, আমি কেবল লাইনটি মুছতে চাই। উদাহরণ স্বরূপ; সুতরাং আমি 3ddjসম্পূর্ণ নথির জন্য কমান্ড পুনরাবৃত্তি করতে চাই ।

Text I want to keep.   
Text I want to delete.  
Text I want to delete.  
Text I want to delete.  
Text I want to keep.  
Text I want to delete.  
Text I want to delete.  
Text I want to delete.  
Text I want to keep.  
Text I want to delete.  
Text I want to delete.  
Text I want to delete.   

সুতরাং দেখে মনে হচ্ছে ...

Text I want to keep.  
Text I want to keep.  
Text I want to keep.  

ধন্যবাদ.


আপনি regular-expressionআপনার প্রশ্নের ট্যাগটি অন্তর্ভুক্ত করেছেন , তবে প্রশ্নটি নিয়মিত প্রকাশের সাহায্যে এটি করার কোনও কারণ নির্দিষ্ট করে বলে মনে হচ্ছে না। আপনি যদি এমন কোনও বিষয় সন্ধান করছেন যা নিয়মিত প্রকাশ প্রকাশ করে তবে স্ট্যাকওভারফ্লো / প্রশ্ন / 17735289 /… আগ্রহী হতে পারে। এই প্রশ্নটি নোটপ্যাড ++ সম্পর্কে ছিল, তবে উত্তরটি পিসিরি রেজেক্স ছাড়া কিছুই ব্যবহার করে না। (অস্বীকৃতি: আমি সে উত্তরটি লিখেছি))
জ্যাস্পার

পরের বার আপনি যখন কোন প্রশ্ন জিজ্ঞাসা করবেন, তখন "লেখার জন্য ধন্যবাদ। দুর্দান্ত সমাধান!" লেখার দরকার নেই প্রতি একক উত্তরে। আপনি যখন কোনও উত্তরে নতুন মন্তব্য তৈরি করার চেষ্টা করেন তখন এটি লিখিত হয়।
পাইপ

এটি যোগ করার জন্য, এখানে প্রশংসা প্রদর্শনের উপযুক্ত উপায়টি হল আপনার পক্ষে সবচেয়ে ভাল কাজ করা উত্তরটি গ্রহণ করা এবং আপনি যে সহায়ক বা দরকারী বলে মনে করেন সেগুলি উত্তরকে সমর্থন করে। লোকেরা বরং এটি "ধন্যবাদ" মন্তব্যের চেয়ে দেখতে পাবে।
বি লেয়ার

উত্তর:


19

খুব সহজ পদ্ধতির:

  1. আপনি মুছে ফেলতে চান প্রথম লাইনে যান।
  2. একটি ম্যাক্রো রেকর্ড করুন: qa3ddjq
  3. এটি একটি উচ্চ সংখ্যার সাথে পুনরাবৃত্তি করুন: 1000 @ ক

তৃতীয় ধাপ ম্যাক্রোর এক হাজার বার পুনরাবৃত্তি করবে বা ত্রুটি দেখা না দেওয়া পর্যন্ত। ফাইলের শেষ প্রান্তে আঘাত করা (সুতরাং মোছার জন্য কোনও লাইন নেই) ত্রুটি তৈরি করে এবং ম্যাক্রোর পুনরাবৃত্তি বাতিল করা হয়।

দেখুন :help recording


2
এটা আশ্চর্যজনক!!! আপনাকে অনেক ধন্যবাদ, যা আমার পক্ষে কাজ করেছে: ডি
ম্যাক্স কোপলি

1
ব্যাখ্যা: q(কমান্ড মোডে, এবং ভিএম বা অন্যান্য সাম্প্রতিক বিকল্প সংস্করণে [নেওভিম, ইত্যাদি], তবে আসল vi তে নয়) এর অর্থ "রেকর্ডিং শুরু করুন, এবং এটি 'পরবর্তী অক্ষর' বাফারে রেখে দিন"। সুতরাং: এর qaঅর্থ "'একটি' বাফারে রেকর্ডিং শুরু করুন '। তারপরে টাইপ করা প্রতিটি কী (পরবর্তী qকমান্ড মোড অবধি ) রেকর্ড করা হয় (আপনি এমনকি রেকর্ড করতে পারেন: সম্পাদনা মোডে যান, কিছু টাইপ করুন, কমান্ড মোডে এসকেপিং ইত্যাদি)। তারপরে 12@a12 বার বার বাফার "এ" রেকর্ডকৃত ক্রিয়াগুলি পুনরাবৃত্তি করবে।
অলিভিয়ার ডুলাক

3
অতিরিক্ত হিসাবে, আপনি যদি 1000@qশেষের মতো কিছু চালাতে না চান তবে আপনি একটি পুনরাবৃত্ত ম্যাক্রো তৈরি করতে পারেন: qa3ddj@aq@aযদিও আপনাকে খালি শুরু হওয়ার qaqআগে প্রথমে এটি করতে হবে "a
জেমস

17

আমার সবচেয়ে সহজ সমাধানটি হ'ল:

:%norm j3dd

এটাই:

  • %: প্রতিটি লাইনের জন্য
  • norm: সাধারণ মোডে যেমন নীচের কীগুলি চালান
  • j3dd: লাইনে নিচে যান 3 টি লাইন মুছুন

সুতরাং প্রথম লাইন থেকে, দ্বিতীয় একের নিচে যান এবং পরবর্তী 3 লাইন মুছুন। দ্বিতীয়টি Text I want to keep.এখন দ্বিতীয় লাইনে রয়েছে। এক লাইন নীচে যান, 3 মুছুন।


দ্রষ্টব্য: আপনি যদি পুরো ফাইলটি প্রক্রিয়া করতে না চান তবে আপনি ফাইলটি 5 ম লাইন থেকে শেষ পর্যন্ত প্রক্রিয়া করতে %normউদাহরণ সহ প্রতিস্থাপন করতে পারেন 5,$norm


4
খুব সুন্দর বিকল্প! ভিমে কাজ করে (vi নয়)। "আদর্শ" সম্পর্কে এর আগে কখনও শুনিনি! (এবং আমি এক ধরণের vi [m] গীক)
অলিভিয়ার ডুলাক

6

আপনার কাছে ইতিমধ্যে কয়েকটি দুর্দান্ত সমাধান রয়েছে। এখানে অন্য একটি:

:g/^/if line('.')%4!=1|:s/^/DELETE ME/|endif
:g/^DELETE ME/d

প্রথমত, আমরা প্রতিটি লাইনে একটি ক্রিয়াকলাপ করি (এর সাথে :gমিলিয়ে ^(লাইনের শুরু)) এবং প্রতিটি লাইন সংখ্যার জন্য ফলাফলটি সম্পাদন করে linenumber % 4। ফলাফলটি যদি অসম হয় 1, আমরা DELETE MEলাইনটির শুরুতে যুক্ত করব, পরবর্তী কমান্ড দ্বারা মুছে ফেলা লাইনগুলি চিহ্নিত করব।

পরবর্তী কমান্ডটি একটি নিয়মিত ( :g) কমান্ড, যা এর সাথে শুরু হওয়া DELETE MEএবং এর সাথে করা সমস্ত লাইনের সাথে মেলে ।

দ্রষ্টব্য, আপনি প্রথম :gকমান্ডটি ব্যবহার করে অবিলম্বে লাইনটি মুছতে পারবেন না , কারণ এটি ফলাফলের মডুলোর গণনা পরিবর্তন করবে এবং এর মতো, আমাদের প্রথমে লাইনগুলি চিহ্নিত করতে হবে এবং দ্বিতীয় ধাপে এটি মুছে ফেলতে হবে।


4

আমি জানি এটি viচ্যানেল, তবে আমার কাছে এটি একটি sedসমস্যা।

sed -ne 'p;n;n;n' <file >newfile

সুতরাং আপনি এটি একটি viসমাধান মধ্যে wrangle করতে পারেন :

:0
!Gsed -ne 'p;n;n;n'

1
একটি সেড সমাধানের জন্য +1।
খ্রিস্টান ব্র্যাব্যান্ড

3

একটি বিকল্প (আমি মনে করি আমরা 1 লাইনটি দিয়ে শুরু করব, এবং উদাহরণ টেক্সট অনুসারে 2-4, 6-8 এবং তাই লাইনগুলি মুছুন):

while line(".") < line("$")
    silent +1delete _ 3
endwhile

যদি ইন্টারঅ্যাকটিভভাবে এটি করা পছন্দ করে তবে আপনি "কমান্ড-লাইন রেজিস্টার" ব্যবহার করতে পারেন। যে, টিপুন

:+1del 3<CR> এবং তারপর 1000@:


1

একটি বিকল্প: আপনি যে কোনও লাইন রাখতে চান: 1, 4 ইত্যাদি আপনি ব্যবহার করতে পারেন:

awk '!((FNR-1)%3)'  file > newfile
      # awk: when a condition is given without action:
      #        prints the lines for which the condition returns 0.
      # FNR designates the line number in the current file.
      # a%3 : takes the modulus of a and 3. ( 0%3=0, 1%3=1, 2%3=2, 3%3=0, 4%3=1, etc.) 
      # This will be 0 for 3, 6, etc. 
      # But we want it to be 0 (true) for 1, 4, etc : so we substract 1 to NR

# to see that it keeps those lines:
seq 1 20 | awk '!((NR-1)%3)'
1
4
7
10
13
16
19

অন্য বিকল্প: আপনি যদি লাইনগুলি জানতে চান তবে কিছু অনন্য প্যাটার্নের সাথে মেলে:

# for exemple each line you want contains "some pattern":
fgrep "some pattern" file > newfile
# (or regular grep if you want "some pattern" to be interpreted as a regexp)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.