ভিমের অন্যান্য লাইনটি কীভাবে মুছবেন?


100

আমি ভিম বাফার থেকে অন্য প্রতিটি লাইন মুছে ফেলতে চাই, দ্বিতীয়টি দিয়ে শুরু করে, যেমন লাইন 2, 4, 6, ইত্যাদি ইত্যাদি উদাহরণস্বরূপ, যদি বাফারের সামগ্রীগুলি হয়:

aaa
bbb
ccc
ddd
eee
fff

তারপরে, পছন্দসই লাইন অপসারণের পরে, এটি হওয়া উচিত:

aaa
ccc
eee

আপনি একটি ম্যাক্রো ব্যবহার করতে সক্ষম হবেন: oreillynet.com/mac/blog/2006/07/…
মার্ক উইলকিন্স

আমি এটির উত্তরের ধন পছন্দ করি। পছন্দসই।
ফ্রগজিথেফ্রোগ

উত্তর:


106

আপনি এটির জন্য ম্যাক্রো ব্যবহার করতে পারেন। নিম্নলিখিত করুন।

  • কমান্ড মোডে শুরু করুন।
  • টিপে ফাইলটির শুরুতে যান gg
  • টিপুন qq
  • নীচে তীরটি ক্লিক করুন এবং ddপরে টিপুন ।
  • টিপুন q
  • টিপুন 10000@q

পিএস: কমান্ড মোডে যেতে কয়েকবার এস্কেপ টিপুন।


11
ধরে
নিচ্ছি

4
আসলে আপনি ভুল মাইকেল। এটি নির্বিঘ্নে কাজ করে কারণ VI ফাইলের শেষের সাথে সাথে হ'ল ম্যাক্রো চালানো বন্ধ করবে। উপরের নমুনাটি দিয়ে আপনি খুব সহজেই চেষ্টা করে দেখতে পারেন।
রুই

4
ঠিক আছে, যে কোনও ম্যাক্রোর মতো আপনার প্রথমবার এটি ঠিক হওয়া দরকার তবে এর পরে আপনি কেবল 10000 @ কিউ টাইপ করে যে কোনও ফাইলের জন্য আবেদন করতে পারেন। যেভাবেই আমি বিশ্বাস করি এটি কেবল স্বাদের বিষয় তাই আমি অবশ্যই দার্শনিক বিতর্ক শুরু করতে যাচ্ছি না। :)
রুই

4
আমি 'ম্যাক্রো' ব্যবহার করতে পছন্দ করি। ম্যাক্রো ব্যবহার করে আপনি কীভাবে একটি নির্দিষ্ট কাজ সমাধান করবেন এবং ভিআইএমকে এটি আপনার জন্য পুনরাবৃত্তি করতে দেয় তা 'বর্ণনা' করেন। আরইউআই, আমি তীরচিহ্নের পরিবর্তে 'জ' ব্যবহার করতে পছন্দ করব।
সমাধান

4
:g/^/+dব্যবহারকারী থেকে স্ট্যাকওভারফ্লো.com / users / 254635 / ib (বেলো) এটি সমাধানের আরও মার্জিত উপায়।
সেরজিওআরাউজো

260

টাস্কটি সম্পাদনের একটি মার্জিত (এবং দক্ষ) উপায় হ'ল :+deleteকমান্ডটি ব্যবহার করে প্রতিটি লাইনে বর্তমানের অনুসরণ করে লাইনটি মুছে ফেলা কমান্ডটি আহ্বান করা :global:

:g/^/+d

10
কেন এই উত্তরটি বেশি ভোট পেল না? এটি এত পরিষ্কার এবং সহজ। বিকল্পভাবে আপনি প্রথম লাইনটি মুছে ফেলতে এবং উপরের কমান্ডটি চালিয়ে সমস্ত বিজোড় লাইন মুছে ফেলতে পারেন।
উসাগি

4
@ উসাগি: ধন্যবাদ! আমি এটি সম্পর্কে একইভাবে অনুভব করি। এবং হ্যাঁ, আপনি একেবারে ঠিক বলেছেন, :1d|g/^/+dবিজোড় লাইনগুলি মুছবেন।
ইব।

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

4
আমি জানি, এই উত্তরটি আমাকে বাইরে যেতে এবং মাছ শিখতে বাধ্য করেছে: g কমান্ড (এটি, এটি আমাকে এই পৃষ্ঠাটি গুগল করেছে - vim.wikia.com/wiki/Power_of_g )।
স্নেচ

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

66

আমরা প্রদত্ত নরমাল মোড কমান্ডগুলি ব্যবহার করতে :normalবা :normপ্রয়োগ করতে পারি । সূত্র.

:%norm jdd

16
সম্ভবত এখানে এবং সংযুক্ত, অগোছালো, ঠকানো শীট উভয় ক্ষেত্রেই ব্যাখ্যাটির অভাবের কারণে এই উত্তরটি যথেষ্ট মনোযোগ পাচ্ছে না। নর্ম কমান্ডটি তার অনুসরণকারী বর্ণগুলির সমতুল্য স্বাভাবিক মোড কমান্ডগুলি চালায়। সুতরাং এখানে এটি চলছে একটি লাইন সরানো j, এবং ডিডি এটি মুছতে। একাদশ লাইনে এই ক্ষেত্রে আরও 'জ' যুক্ত করে এটি সাধারণীকরণযোগ্য।
ইমোয়াতামা

5
এবং% 1, for (1 লাইন থেকে শেষ পর্যন্ত নিম্নলিখিত কমান্ডটি কার্যকর করুন) এর জন্য সংক্ষিপ্ত
ল্যাম্বার্ট

4
%norm ddjআপনি যদি বিজোড় সারিগুলি মুছতে চান তবে কেন কাজ করে না সে সম্পর্কে আমি আগ্রহী ।
সাইকেল

10
:map ^o ddj^o
^o

এখানে C সিটিআরএল জন্য দাঁড়ানো। প্রতি দুটি লাইনে একটি লাইন মুছতে পুনরাবৃত্ত ম্যাক্রো। আপনার প্রথম লাইন ভাল চয়ন করুন এবং এটি সম্পন্ন হয়েছে।


8

থেকে তেজ মেইল সংরক্ষণাগার :

:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile

(ভিআইএম কমান্ড লাইনের এক লাইনে টাইপ করতে, সারিটি 1,3,5,7 মুছবে, ...)


4
তারপরে আমি পছন্দ করব !perl -ne 'print unless $. % 2':-)
অ্যালেক্স ব্র্যাসেটভিক

এবং, অ্যালেক্স, আমি অবশ্যই আপনার আমার সমাধানটিকে প্রাধান্য দেব, তবে এটি বিবেচনাযোগ্য কারণ এটি এখানে কেবলমাত্র ভিআইএম ব্যবহার করে একমাত্র বুদ্ধিমান সমাধান।
মাইকেল ক্রেলিন -

ম্যাক্রো উপায় এত সহজ।
trusktr

+1 নমনীয়তার কারণে if (expression)যা প্রতিটি তৃতীয় লাইনের জন্যও কাজ করে ইত্যাদি ইত্যাদি
জেনস

5

শেল কমান্ডের সাহায্যে আপনি সর্বদা পাইপ করতে পারেন, যার অর্থ আপনি নিজের পছন্দ মতো কোনও স্ক্রিপ্টিং ভাষা ব্যবহার করতে পারেন:

:%!perl -nle 'print if $. % 2'

(বা কোন লাইনের উপর নির্ভর করে "যদি" পরিবর্তে "না" ব্যবহার করুন)


আপনার -lপার্লের স্যুইচ দরকার নেই ... এছাড়াও, আমি বলব awkপার্লের তুলনায় এটি কিছুটা বেশি বিস্তৃত, যদিও এখনকার দিনে এটি এত বেশি নয়, এবং এটি আরও খাটো করতে পারে:, :%!awk NR\%2বা :%!awk 1-NR\%2অন্য লাইনের জন্য।
প্রথমবার

4
:%!awk -- '++c\%2'

বিকল্পভাবে

:%!awk -- 'c++\%2'

আপনি অর্ধেক আউট করতে চান উপর নির্ভর করে।


উম্ম, বিদ্যমান NRভেরিয়েবলটি ব্যবহার করবেন না কেন ?
পূর্ববর্তী

ঠিক। কারণ আমি এটি সম্পর্কে ভুলে গেছি। ;-) তবে আসলে "যথাযথ" রূপটি এনআর এর সাথে আরও দীর্ঘ হবে। এবং দুটি সুন্দর চেহারা সমকক্ষ হবে না ।
মাইকেল ক্রেলিন - হ্যাকার

:%!awk NR\%2বা :%!awk 1-NR\%2, যেমন আমি অন্য মন্তব্যে পোস্ট করেছি। এটা খুব বেশি দীর্ঘ।
প্রথম দিন

4
1-NRচেয়ে দীর্ঘতর হয় c++। হ্যাঁ, আমি জানি এটি একটি চরিত্র। যেমনটি আমি বলেছিলাম - আসল কারণটি আমি এটি সম্পর্কে ভুলে গেছি। যাইহোক, দেখে মনে হচ্ছে লোকেরা এখানে অ্যাওকের সৌন্দর্যের প্রশংসা করে না।
মাইকেল ক্রেলিন - হ্যাকার

এবং এর NRচেয়ে কম ++c:)
ডেস্ক

3

আপনি ভিমের নিজস্ব অনুসন্ধান এবং বিকল্প ক্ষমতা যেমন ব্যবহার করতে পারেন: আপনার কার্সারটিকে প্রথম লাইনে রাখুন, এবং সাধারণ মোডে টাইপ করুন:

:.,/fff/s/\n.*\(\n.*\)/\1/g
  • .,/fff/প্রতিকল্পন জন্য পরিসর। এর অর্থ "এই রেখাটি থেকে রেখার সাথে যা রেজেক্সের সাথে মেলে fff(এই ক্ষেত্রে, শেষ লাইন)।
  • s///বিকল্প কমান্ড। এটি একটি রেজেক্সের সন্ধান করে এবং এর প্রতিটি ঘটনাকে স্ট্রিংয়ের সাথে প্রতিস্থাপন করে। gশেষ মানে এ যতদিন Regex পাওয়া হচ্ছে রাখে প্রতিকল্পন পুনরাবৃত্তি।
  • রেজেক্স \n.*\(\n.*\)একটি নতুন লাইনের সাথে .*মেলে , তারপরে একটি সম্পূর্ণ লাইন ( একটি নতুন লাইন বাদে যে কোনও সংখ্যক অক্ষরের সাথে মেলে), তারপরে অন্য একটি নতুন লাইন এবং অন্য একটি লাইন। প্রথম বন্ধনী \(এবং \)তাদের ভিতরে প্রকাশটি রেকর্ড করার কারণ হয়, তাই আমরা পরে এটি ব্যবহার করে ব্যবহার করতে পারি \1
  • \1 এটির পরে দলবদ্ধ নিউলাইন এবং লাইনটি সন্নিবেশ করান, কারণ আমরা পরের লাইনটি খুব বেশি চলে যেতে চাই না - আমরা কেবলমাত্র প্রতিস্থাপনের ব্যবস্থাটি এটি দিয়ে যেতে চাই তাই আমরা এটি পরবর্তী প্রতিস্থাপনে মুছে ফেলব না।

আপনি মুছে ফেলতে চান এমন পরিসরটি নিয়ন্ত্রণ করতে পারেন এবং আপনাকে কোনও বাহ্যিক সরঞ্জাম ব্যবহার করতে হবে না।


বা $পরিবর্তে /fff/, ফাইলের বিষয়বস্তু নির্বিশেষে ফাইলের শেষের জন্য।
প্রথম দিন

3

অন্য পদ্ধতির হিসাবে আপনি অজগরটি ব্যবহার করতে পারেন যদি আপনার ভিম এর পক্ষে সমর্থন করে।

:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]

b = cb[:]অস্থায়ীভাবে বর্তমান বাফারে সমস্ত লাইন অনুলিপি করে bb[::2]বাফার থেকে প্রতিটি দ্বিতীয় লাইন পায় এবং এটি পুরো বর্তমান বাফারকে নির্ধারণ করে cb[:]bবাফার অবজেক্টগুলি প্রসারিত স্লাইস সিনট্যাক্সকে সমর্থন করে না বলে এই অনুলিপিটি প্রয়োজনীয়।

এটি সম্ভবত "ভিম ওয়ে" নয়, তবে অজগরটি জানা থাকলে এটি মনে রাখা আরও সহজ হতে পারে।


2

বিজোড় লাইনগুলি মুছতে (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g

এমনকি লাইনগুলি মুছতে (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g

নতুন লাইনের অক্ষর এবং তারপরে আরও কিছু পাঠ্য (দ্বিতীয় লাইন তৈরি করে) পরে পাঠ্য (প্রথম লাইনটি তৈরি করে) অনুসন্ধান করুন এবং তারপরে প্রথম ম্যাচ (বিজোড় লাইন) বা দ্বিতীয় ম্যাচ (এমনকি লাইন) দ্বারা প্রতিস্থাপন করুন তারপরে গাড়ি চালানো


0

দাও:

:% !sed -e '2~2 d'

^^^^                  pipe file through a shell command
    ^^^^^^            the command is sed, and -e describes an expression as parameter
            ^^^^^     starting with the second line, delete every second line

-1

সমাধান

আপনি এই চেষ্টা করতে পারেন

:1,$-1g/^/+1d

সম্পাদনা করুন

আমি আরও পরিষ্কার হওয়ার চেষ্টা করব (দুটি অংশ)

প্রথম অংশ নির্বাচনের ব্যাপ্তি ( :from,to)
দ্বিতীয় অংশটি ক্রিয়া ( dমুছুন)

  • প্রথম লাইন থেকে শেষ পর্যন্ত তবে এক রেখার ব্যাপ্তি ( :1,$-1)
  • গ্লোবাল ( g) +1dপরবর্তী লাইনে মুছুন ( )

আপনি আপনার ফাইলের প্রথম লাইনে যাওয়ার চেষ্টা করতে পারেন এবং কার্যকর :+1dকরতে পারেন আপনি পরের লাইনটি অদৃশ্য হয়ে দেখতে পাবেন

আমি জানি এটি কর্দমাক্ত তবে এটি ভিম এবং এটি কার্যকর


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