আমি ভিম বাফার থেকে অন্য প্রতিটি লাইন মুছে ফেলতে চাই, দ্বিতীয়টি দিয়ে শুরু করে, যেমন লাইন 2, 4, 6, ইত্যাদি ইত্যাদি উদাহরণস্বরূপ, যদি বাফারের সামগ্রীগুলি হয়:
aaa
bbb
ccc
ddd
eee
fff
তারপরে, পছন্দসই লাইন অপসারণের পরে, এটি হওয়া উচিত:
aaa
ccc
eee
আমি ভিম বাফার থেকে অন্য প্রতিটি লাইন মুছে ফেলতে চাই, দ্বিতীয়টি দিয়ে শুরু করে, যেমন লাইন 2, 4, 6, ইত্যাদি ইত্যাদি উদাহরণস্বরূপ, যদি বাফারের সামগ্রীগুলি হয়:
aaa
bbb
ccc
ddd
eee
fff
তারপরে, পছন্দসই লাইন অপসারণের পরে, এটি হওয়া উচিত:
aaa
ccc
eee
উত্তর:
আপনি এটির জন্য ম্যাক্রো ব্যবহার করতে পারেন। নিম্নলিখিত করুন।
gg
।qq
।dd
পরে টিপুন ।q
।10000@q
পিএস: কমান্ড মোডে যেতে কয়েকবার এস্কেপ টিপুন।
:g/^/+d
ব্যবহারকারী থেকে স্ট্যাকওভারফ্লো.com / users / 254635 / ib (বেলো) এটি সমাধানের আরও মার্জিত উপায়।
টাস্কটি সম্পাদনের একটি মার্জিত (এবং দক্ষ) উপায় হ'ল :+delete
কমান্ডটি ব্যবহার করে প্রতিটি লাইনে বর্তমানের অনুসরণ করে লাইনটি মুছে ফেলা কমান্ডটি আহ্বান করা :global
:
:g/^/+d
:1d|g/^/+d
বিজোড় লাইনগুলি মুছবেন।
আমরা প্রদত্ত নরমাল মোড কমান্ডগুলি ব্যবহার করতে :normal
বা :norm
প্রয়োগ করতে পারি । সূত্র.
:%norm jdd
%norm ddj
আপনি যদি বিজোড় সারিগুলি মুছতে চান তবে কেন কাজ করে না সে সম্পর্কে আমি আগ্রহী ।
:map ^o ddj^o
^o
এখানে C সিটিআরএল জন্য দাঁড়ানো। প্রতি দুটি লাইনে একটি লাইন মুছতে পুনরাবৃত্ত ম্যাক্রো। আপনার প্রথম লাইন ভাল চয়ন করুন এবং এটি সম্পন্ন হয়েছে।
থেকে তেজ মেইল সংরক্ষণাগার :
:let i=1 | while i <= line('$') | if (i % 2) | exe i . "delete" | endif | let i += 1 | endwhile
(ভিআইএম কমান্ড লাইনের এক লাইনে টাইপ করতে, সারিটি 1,3,5,7 মুছবে, ...)
!perl -ne 'print unless $. % 2'
:-)
if (expression)
যা প্রতিটি তৃতীয় লাইনের জন্যও কাজ করে ইত্যাদি ইত্যাদি
শেল কমান্ডের সাহায্যে আপনি সর্বদা পাইপ করতে পারেন, যার অর্থ আপনি নিজের পছন্দ মতো কোনও স্ক্রিপ্টিং ভাষা ব্যবহার করতে পারেন:
:%!perl -nle 'print if $. % 2'
(বা কোন লাইনের উপর নির্ভর করে "যদি" পরিবর্তে "না" ব্যবহার করুন)
-l
পার্লের স্যুইচ দরকার নেই ... এছাড়াও, আমি বলব awk
পার্লের তুলনায় এটি কিছুটা বেশি বিস্তৃত, যদিও এখনকার দিনে এটি এত বেশি নয়, এবং এটি আরও খাটো করতে পারে:, :%!awk NR\%2
বা :%!awk 1-NR\%2
অন্য লাইনের জন্য।
:%!awk -- '++c\%2'
বিকল্পভাবে
:%!awk -- 'c++\%2'
আপনি অর্ধেক আউট করতে চান উপর নির্ভর করে।
NR
ভেরিয়েবলটি ব্যবহার করবেন না কেন ?
:%!awk NR\%2
বা :%!awk 1-NR\%2
, যেমন আমি অন্য মন্তব্যে পোস্ট করেছি। এটা খুব বেশি দীর্ঘ।
1-NR
চেয়ে দীর্ঘতর হয় c++
। হ্যাঁ, আমি জানি এটি একটি চরিত্র। যেমনটি আমি বলেছিলাম - আসল কারণটি আমি এটি সম্পর্কে ভুলে গেছি। যাইহোক, দেখে মনে হচ্ছে লোকেরা এখানে অ্যাওকের সৌন্দর্যের প্রশংসা করে না।
NR
চেয়ে কম ++c
:)
আপনি ভিমের নিজস্ব অনুসন্ধান এবং বিকল্প ক্ষমতা যেমন ব্যবহার করতে পারেন: আপনার কার্সারটিকে প্রথম লাইনে রাখুন, এবং সাধারণ মোডে টাইপ করুন:
:.,/fff/s/\n.*\(\n.*\)/\1/g
.,/fff/
প্রতিকল্পন জন্য পরিসর। এর অর্থ "এই রেখাটি থেকে রেখার সাথে যা রেজেক্সের সাথে মেলে fff
(এই ক্ষেত্রে, শেষ লাইন)।s///
বিকল্প কমান্ড। এটি একটি রেজেক্সের সন্ধান করে এবং এর প্রতিটি ঘটনাকে স্ট্রিংয়ের সাথে প্রতিস্থাপন করে। g
শেষ মানে এ যতদিন Regex পাওয়া হচ্ছে রাখে প্রতিকল্পন পুনরাবৃত্তি।\n.*\(\n.*\)
একটি নতুন লাইনের সাথে .*
মেলে , তারপরে একটি সম্পূর্ণ লাইন ( একটি নতুন লাইন বাদে যে কোনও সংখ্যক অক্ষরের সাথে মেলে), তারপরে অন্য একটি নতুন লাইন এবং অন্য একটি লাইন। প্রথম বন্ধনী \(
এবং \)
তাদের ভিতরে প্রকাশটি রেকর্ড করার কারণ হয়, তাই আমরা পরে এটি ব্যবহার করে ব্যবহার করতে পারি \1
।\1
এটির পরে দলবদ্ধ নিউলাইন এবং লাইনটি সন্নিবেশ করান, কারণ আমরা পরের লাইনটি খুব বেশি চলে যেতে চাই না - আমরা কেবলমাত্র প্রতিস্থাপনের ব্যবস্থাটি এটি দিয়ে যেতে চাই তাই আমরা এটি পরবর্তী প্রতিস্থাপনে মুছে ফেলব না।আপনি মুছে ফেলতে চান এমন পরিসরটি নিয়ন্ত্রণ করতে পারেন এবং আপনাকে কোনও বাহ্যিক সরঞ্জাম ব্যবহার করতে হবে না।
$
পরিবর্তে /fff/
, ফাইলের বিষয়বস্তু নির্বিশেষে ফাইলের শেষের জন্য।
অন্য পদ্ধতির হিসাবে আপনি অজগরটি ব্যবহার করতে পারেন যদি আপনার ভিম এর পক্ষে সমর্থন করে।
:py import vim; cb = vim.current.buffer; b = cb[:]; cb[:] = b[::2]
b = cb[:]
অস্থায়ীভাবে বর্তমান বাফারে সমস্ত লাইন অনুলিপি করে b
। b[::2]
বাফার থেকে প্রতিটি দ্বিতীয় লাইন পায় এবং এটি পুরো বর্তমান বাফারকে নির্ধারণ করে cb[:]
। b
বাফার অবজেক্টগুলি প্রসারিত স্লাইস সিনট্যাক্সকে সমর্থন করে না বলে এই অনুলিপিটি প্রয়োজনীয়।
এটি সম্ভবত "ভিম ওয়ে" নয়, তবে অজগরটি জানা থাকলে এটি মনে রাখা আরও সহজ হতে পারে।
বিজোড় লাইনগুলি মুছতে (1,3,5, ..) -> :%s/\(.*\)\n\(.*\)\n/\2\r/g
এমনকি লাইনগুলি মুছতে (2,4,6, ..) -> :%s/\(.*\)\n.*\n/\1\r/g
নতুন লাইনের অক্ষর এবং তারপরে আরও কিছু পাঠ্য (দ্বিতীয় লাইন তৈরি করে) পরে পাঠ্য (প্রথম লাইনটি তৈরি করে) অনুসন্ধান করুন এবং তারপরে প্রথম ম্যাচ (বিজোড় লাইন) বা দ্বিতীয় ম্যাচ (এমনকি লাইন) দ্বারা প্রতিস্থাপন করুন তারপরে গাড়ি চালানো
আপনি এই চেষ্টা করতে পারেন
:1,$-1g/^/+1d
আমি আরও পরিষ্কার হওয়ার চেষ্টা করব (দুটি অংশ)
প্রথম অংশ নির্বাচনের ব্যাপ্তি ( :from,to
)
দ্বিতীয় অংশটি ক্রিয়া ( d
মুছুন)
:1,$-1
)g
) +1d
পরবর্তী লাইনে মুছুন ( )আপনি আপনার ফাইলের প্রথম লাইনে যাওয়ার চেষ্টা করতে পারেন এবং কার্যকর :+1d
করতে পারেন আপনি পরের লাইনটি অদৃশ্য হয়ে দেখতে পাবেন
আমি জানি এটি কর্দমাক্ত তবে এটি ভিম এবং এটি কার্যকর