সন্ধান করুন এবং নির্দিষ্ট লাইনে vim প্রতিস্থাপন


95

আমি ব্যাবহার করতে পারি

:5,12s/foo/bar/g

fooএটি bar5 এবং 12 লাইনের মধ্যে অনুসন্ধান এবং প্রতিস্থাপন করতে আমি কীভাবে এটি কেবল 5 এবং 12 লাইনে করতে পারি (এবং এর মধ্যবর্তী লাইনে নয়)?

উত্তর:


76

ভিমের বিশেষ নিয়মিত প্রকাশের পরমাণু রয়েছে যা নির্দিষ্ট লাইন, কলাম ইত্যাদিতে মেলে; ম্যাচগুলিকে সীমাবদ্ধ করতে আপনি এগুলি (সম্ভবত ব্যাপ্তি ছাড়াও) ব্যবহার করতে পারেন:

:5,12s/\(\%5l\|\%12l\)foo/bar/g

দেখা :help /\%l


8
আমার প্রত্যাশার চেয়ে আরও জটিল উপায় তবে আমার প্রশ্নের সঠিক উত্তর দেয় answers ধন্যবাদ!
pfnuesel

56

আপনি 5 নং লাইনে প্রতিস্থাপন করতে পারেন এবং লাইন 12 এ সর্বনিম্ন প্রচেষ্টা দিয়ে পুনরাবৃত্তি করতে পারেন:

:5s/foo/bar
:12&

ইনগো দ্বারা চিহ্নিত হিসাবে, :&আপনার পতাকাগুলি ভুলে যায়। যেহেতু আপনি ব্যবহার করছেন /g, সঠিক আদেশটি হ'ল :&&:

:5s/foo/bar/g
:12&&

দেখুন :help :&এবং বন্ধুরা।


10
অস্পষ্ট :&ব্যবহার করার জন্য +1 করুন । যদি পতাকা ( s/../../g) থাকে তবে একটি ব্যবহার করতে হবে :&&, যদিও ...
ইনগো কারকাত

10
@ ইঙ্গোকারকাত, ন্যায্য হতে আমার মনে \(\%5l\|\%12l\)হয় এর চেয়ে বেশি অস্পষ্ট:&
ডাবলডাউন

13

আপনি সর্বদা একটি যোগ করতে পারে c। এটি প্রতিটি ম্যাচের জন্য নিশ্চিতকরণের জন্য জিজ্ঞাসা করবে।

:5,12s/foo/bar/gc

4
5 এবং 12 লাইনের মধ্যে অনেকগুলি ম্যাচ থাকলে এটি একটি দুঃস্বপ্ন হতে পারে ( gখেলায় একটি পতাকা রয়েছে তা মনে রাখবেন )
ডাবলডাউন

4
@ ডাবলডাউন এটি সর্বজনীন সমাধান (যেখানে অনেকগুলি সম্ভাব্য প্রার্থী রয়েছে) বোঝাতে চাইছেন না, তবে বেশিরভাগ ক্ষেত্রেই আপনি কি সত্যই n5 বা 6 বার চাপ \(\%5l\|\%12l\)দেওয়ার বিষয়টি বিকল্প বিবৃতিতে যুক্ত করার চেয়ে আরও ভয়ঙ্কর ?
ডিন

আমি এটি দরকারী বলে মনে করি, আমি প্রতিটি অন্যান্য লাইন পরিবর্তন করতে চেয়েছিলাম, এটি আমি শেষ করে যা করেছি তার চেয়ে দ্রুত হত।
টিকটাক

9

আকর্ষণীয় প্রশ্ন। দেখে মনে হচ্ছে কেবলমাত্র ব্যাপ্তি নির্বাচন রয়েছে এবং একাধিক লাইন নির্বাচন নেই:

http://vim.wikia.com/wiki/Ranges

তবে, আপনার যদি 5 এবং 12 লাইনে বিশেষ কিছু থাকে তবে আপনি :gঅপারেটরটি ব্যবহার করতে পারেন । যদি আপনার ফাইলটি দেখতে এইরকম হয় (কেবল রেফারেন্সের জন্য সংখ্যা):

 1     line one
 2     line one
 3     line one
 4     line one
 5     enil one
 6     line one
 7     line one
 8     line one
 9     line one
10     line one
11     line one
12     enil one

আর তুমি প্রতিস্থাপন করতে চান oneদ্বারা enoলাইন যেখানে হচ্ছে সে বিষয়ে enilপরিবর্তে line:

:g/enil/s/one/eno/

4
এটি আসলে অনেকটা
নিচ্ছে

1

আপনি ব্যবহার করতে পারেন ed- vi এবং vim এর অনুরূপ কমান্ড সহ একটি লাইনমুখী পাঠ্য সম্পাদক। এটি সম্ভবত vi এবং vim এর পূর্বাভাস দেয়।

একটি স্ক্রিপ্টে (এখানে একটি ডকুমেন্ট ব্যবহার করে যা এন্ডকম্যান্ড চিহ্নিতকারী পর্যন্ত ইনপুট প্রক্রিয়াকরণ করে) দেখতে দেখতে এটি দেখতে পছন্দ করবে:

ed file <<EndCommands
    5
    s/foo/bar/g
    7
    s/foo/bar/g
    wq
EndCommands

স্পষ্টতই, এড কমান্ডগুলি কমান্ড লাইনেও ব্যবহার করা যেতে পারে।


4
vimবিকল্পের চেয়ে আমি কোনও সুবিধা দেখছি না ।
বার্নহার্ড

4
এবং একই ভিমের সাথেও করা যেতে পারে; সংখ্যাগুলি আসলে আগে রাখা যেতে পারে :s, তবে এখনও :sকমান্ডের সদৃশতা রয়েছে (যা রোমেনেলের সমাধান এড়ানো হয়)।
ইনগো কারকাত

আমার দৃষ্টিভঙ্গিটি ছিল যে ব্যবহারকারী সম্পাদনার জন্য দুটি লাইনের চেয়েও বেশি কিছু বেছে নিতে চেয়েছিলেন। সেক্ষেত্রে একটি অ-ইন্টারেক্টিভ পদ্ধতির আগ্রহ থাকতে পারে - যা এএফএআইপি ভিআইএম দিয়ে করা যায় না।
সন্দেহভাজন

4
ওহ, ভিম এটি করতে পারে (উদাহরণস্বরূপ "প্রাক্তন" মোডে) তবে আপনি ঠিক বলেছেন যে একটি ইন্টারেক্টিভ সম্পাদকের চেয়ে অন্য কোনও সরঞ্জাম পছন্দ করা উচিত। আমার পছন্দটি হবে sed, যদিও ...
ইনগো কারকাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.