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


352

আমি :%s/<search_string>/<replace_string>/gকোনও ফাইল জুড়ে স্ট্রিং প্রতিস্থাপনের জন্য বা :s/<search_string>/<replace_string>/বর্তমান লাইনে প্রতিস্থাপন করতে পারি ।

আমি কীভাবে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে বেছে নিতে পারি?

উদাহরণ: লাইন থেকে টেক্সট প্রতিস্থাপন 6-10, 14-18কিন্তু না থেকে 11-13



উত্তর:


254

:&&কমান্ড একই পতাকা গত প্রতিকল্পন পুনরাবৃত্তি। আপনি এটিতে অতিরিক্ত পরিসর (গুলি) সরবরাহ করতে পারেন (এবং আপনি যতটা পছন্দ করেন)

:6,10s/<search_string>/<replace_string>/g | 14,18&&

আপনার যদি অনেকগুলি রেঞ্জ থাকে তবে আমি বরং একটি লুপ ব্যবহার করব:

:for range in split('6,10 14,18')| exe range 's/<search_string>/<replace_string>/g' | endfor

5
ধন্যবাদ। ভবিষ্যতের ব্যবহারকারীদের জন্য নোট - :6,10s/<search_string>/<replace_string>/g | :14,18&& | :20,23&& | :28,31&&এটিও কাজ করবে, forলুপ মনে রাখা এবং চালানো আরও সহজ করে তোলে।
মিউ 無

5
আমি খুশি তুমি এটা পছন্দ করেছো! :পরবর্তী কমান্ড উপর ঐচ্ছিক, BTW, যাতে আপনি আরো কিছু কীস্ট্রোকগুলি সংরক্ষণ করতে পারবেন।
ইনগো কারকাত

2
:&&আমাকে প্রতি সপ্তাহে কয়েকশ কী-স্ট্রোক সংরক্ষণ করবে। ধন্যবাদ!
pdoherty926

এটি আমার ভিমে শেষে 'ছ' ছাড়া কাজ করে। তাই সম্ভবত আপনি যখন লাইন রেঞ্জটি নির্দিষ্ট করবেন তখন এটির জন্য বিশ্বব্যাপী পতাকা লাগবে না
তাইয়ার আর

3
@ টেয়ারআর রেঞ্জটি রেখাগুলি (উল্লম্বভাবে, তাই কথা বলার জন্য) কভার করে, যখন 'জি' পতাকাটি লাইনটির মধ্যে কেবলমাত্র এক বা সমস্ত ম্যাচ প্রতিস্থাপন করা হয় কিনা তা নির্ধারণ করে।
ইনগো কারকাত

385

সমস্ত প্রতিস্থাপন:

:%s/foo/bar/g

'Foo' এর প্রতিটি ঘটনা (সমস্ত লাইনে) সন্ধান করুন এবং এটিকে 'বার' দিয়ে প্রতিস্থাপন করুন।

নির্দিষ্ট লাইনের জন্য:

:6,10s/foo/bar/g

লাইন 6 থেকে লাইন 10 সহ সকল লাইনগুলির জন্য প্রতিটি 'foo' কে 'বার' তে পরিবর্তন করুন।


3
এখানে / জি এর উদ্দেশ্য কী? দুঃখিত আমি লিনাক্সে নতুন
রাজা আনবাজগান

4
@ রাজাআন্নাবাজগান এই অভিব্যক্তিটির চূড়ান্ত অংশ, শেষের পরে /, যেখানে আপনি অপারেশনের জন্য পতাকাগুলি নির্দেশ করেছেন। এই কমান্ডটি সাধারণত কোনও লাইনে প্রথম ম্যাচটি প্রতিস্থাপন করে ; সঙ্গে gসেটির উপরে ফ্ল্যাগ লাগাতে সব ঘটনার প্রতিস্থাপন করবে।
লিট্টি

17
আপনি যদি অন্য কোনও ব্যক্তির কাজ অনুলিপি করতে ও অতীত করতে চলেছেন তবে আপনার উত্সগুলি সত্যই রেফারেন্স করা উচিত (যেমন, vim.wikia.com/wiki/Search_and_replace)।
অ্যান্ড্রু এস

2
%জিনিস কাজ করে! অন্যথায়, এটি কেবল প্রথম ঘটনা।
সন্তোষ কুমার

7
%=> এই কমান্ডটি সমস্ত লাইনে চালান। g=> একই লাইনে একাধিক উপস্থিতি মেলে।
শাহীন

55

পার্শ্ব নোট হিসাবে, লাইন নম্বরগুলি টাইপ করার পরিবর্তে, কেবল যেখানে ভিজ্যুয়াল মোডগুলির মধ্যে কোনওটি পেতে / প্রতিস্থাপন করতে চান সেই লাইনগুলি হাইলাইট করুন:

  • VISUALমোড ( V)
  • VISUAL BLOCKমোড ( Ctrl+ V)
  • VISUAL LINEমোড ( Shift+ V, আপনার ক্ষেত্রে সেরা কাজ করে)

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

:s/<search_string>/<replace_string>/g

আপনি লক্ষ করবেন যে পরিসীমাটি '<,'>আপনার জন্য স্বয়ংক্রিয়ভাবে প্রবেশ করানো হবে:

:'<,'>s/<search_string>/<replace_string>/g

এখানে '<সহজভাবে প্রথম হাইলাইট করা লাইনটির'> অর্থ এবং শেষ হাইলাইট করা লাইন

নোট করুন যে NORMALমোডে থাকাকালীন আচরণটি অপ্রত্যাশিত হতে পারে : '<এবং একটি মোডে করা '>শেষ হাইলাইটের শুরু এবং শেষের দিকে নির্দেশ করুন VISUAL। পরিবর্তে, NORMALমোডে, বিশেষ লাইন নম্বর .ব্যবহার করা যেতে পারে, যার সহজ অর্থ বর্তমান লাইন । অতএব, আপনি কেবল বর্তমান লাইনে এটির মতো / প্রতিস্থাপন করতে পারেন:

:.s/<search_string>/<replace_string>/g

আরেকটি বিষয় লক্ষণীয় হ'ল :পরিসর এবং সন্ধান / প্রতিস্থাপন কমান্ডের মধ্যে একটি সেকেন্ড সন্নিবেশ করা কোনও ক্ষতি করে না, অন্য কথায়, এই আদেশগুলি এখনও কার্যকর হবে:

:'<,'>:s/<search_string>/<replace_string>/g
:.:s/<search_string>/<replace_string>/g

1
> উদাহরণ: 6-10, 14-18 লাইনগুলি থেকে পাঠ্য প্রতিস্থাপন করুন তবে 11-13 থেকে নয়। - আপনার উত্তর এই প্রশ্নের খুব উত্তর দেয় না, তাই না?
পিজি

27

আপনি দুটি সন্ধান / প্রতিস্থাপন সিকোয়েন্স সহ এটি করতে পারেন

  :6,10s/<search_string>/<replace_string>/g
  :14,18s/<search_string>/<replace_string>/g

দ্বিতীয় বার আপনার সামঞ্জস্য করা দরকার তা হ'ল পরিসরটি তাই এগুলি সমস্ত টাইপ করার পরিবর্তে, আমি শেষ কমান্ডটি পুনরায় স্মরণ করব এবং কেবলমাত্র পরিসীমাটি সম্পাদনা করব


20

ভিমে আপনি যদি বিভ্রান্ত হন যা সমস্ত লাইন প্রভাবিত হবে, নীচে ব্যবহার করুন

 :%s/foo/bar/gc  

প্রতিটি 'foo' কে 'বার' এ পরিবর্তন করুন, তবে প্রথমে নিশ্চিতকরণের জন্য জিজ্ঞাসা করুন। হ্যাঁর জন্য 'y' এবং 'n' এর জন্য চাপুন। তার পরে সংরক্ষণ করতে ভুলবেন না

:wq

1
আপনি cব্যাপ্তিটি নির্দিষ্ট করার পাশাপাশি পতাকাটি ব্যবহার করতে পারেন , তাই :6,10s/<search_string>/<replace_string>/cকাজ করে। cজন্য দাঁড়িয়েছে confirm। আমি cদুর্ঘটনাক্রমে এমন শব্দগুলি প্রতিস্থাপন করা থেকে বিরত রাখতে পতাকাটি প্রায়শই ব্যবহার করি যেখানে আমি সেগুলি উপস্থিত রয়েছে সে সম্পর্কেও ভাবিনি।
ওল্ফসন

16

ষষ্ঠ অনুসন্ধান এবং কমান্ড উদাহরণ প্রতিস্থাপন

আমাদের বলুন যে আপনি "foo" নামক একটি শব্দ খুঁজে পেতে এবং "বার" দিয়ে প্রতিস্থাপন করতে চান।

প্রথম হিট [Esc]কী

টাইপ করুন: (কোলন) এরপরে %s/foo/bar/এবং [এন্টার] কী টিপুন

:%s/foo/bar/


11
আপনার :%s/<search_string>/<replace_string>/gকমান্ড পুরো ফাইলের সমস্ত উপস্থিতি প্রতিস্থাপন করবে। প্রশ্নের ঠিক উত্তর নয়, তবে তবুও দরকারী :)
ট্যানিয়াস

@ ট্যানিয়াস আসলে এটিই ছিল আমার সমস্যার সর্বাধিক সরাসরি উত্তর। আপনি "নির্বাচিত" লাইনগুলিতে ভিমে স্ট্রিংগুলি সন্ধান করুন এবং প্রতিস্থাপন করুন "
ওমিড এন

9

আমাদের বর্তমান লাইন নম্বর প্রবেশের বিরক্ত করার দরকার নেই।

আপনি প্রতিটি পরিবর্তন করতে চান তাহলে fooকরতে barবর্তমান লাইন (জন্য .) এবং দুই পরবর্তী লাইন ( +2), কেবল একটি করুন:

:.,+2s/foo/bar/g

আপনি যদি পরিবর্তনগুলি করার আগে নিশ্চিত করতে চান তবে এর gসাথে প্রতিস্থাপন করুন gc:

:.,+2s/foo/bar/gc

আমি প্রায়শই ব্যবহার করি আরেকটি সুন্দর জিনিস হ'ল :.,$s/foo/bar/gcফাইলের শেষ অবধি বর্তমান লাইন থেকে শুরু করে সন্ধান এবং প্রতিস্থাপন।
ওল্ফসন

3

অনুসন্ধান এবং প্রতিস্থাপন

:%s/search\|search2\|search3/replace/gci

g => বিশ্বব্যাপী অনুসন্ধান

c => প্রথমে নিশ্চয়তার জন্য জিজ্ঞাসা করুন

i => কেস সংবেদনশীল

আপনি যদি নিশ্চিত না করে সরাসরি প্রতিস্থাপন করতে চান তবে নীচের কমান্ডটি ব্যবহার করুন

:%s/search/replace/g

আপনি যদি প্রতিস্থাপনের জন্য নিশ্চিত করতে চান তবে নীচের কমান্ডটি চালান

:%s/search/replace/gc

প্রথমে নিশ্চয়তার জন্য জিজ্ঞাসা করুন, এখানে অনুসন্ধানটি সংবেদনশীল হবে।

:%s/search/replace/gci

1

ভিজ্যুয়াল নির্বাচনের মাধ্যমে পরিসর নির্দিষ্ট করা ঠিক আছে তবে যখন অপারেটর দ্বারা নির্বাচিত হতে পারে কেবল কয়েকটি লাইনের উপর খুব সাধারণ ক্রিয়াকলাপগুলি অপারেটর হিসাবে এই আদেশগুলি প্রয়োগ করা সবচেয়ে ভাল।

দুর্ভাগ্যক্রমে মান vim কমান্ডের মাধ্যমে এটি করা যায় না। আপনি ব্যবহার করে এক ধরণের workaround করতে পারে! (ফিল্টার) অপারেটর এবং যে কোনও পাঠ্য বস্তু। উদাহরণস্বরূপ, অনুচ্ছেদে অপারেশন প্রয়োগ করতে, আপনি এটি করতে পারেন:

!ip

এটি "অনুচ্ছেদের অভ্যন্তরে অপারেটর প্রয়োগ করুন" হিসাবে পড়তে হবে। ফিল্টার অপারেটর কমান্ড মোড শুরু করে এবং স্বয়ংক্রিয়ভাবে "আক্ষরিক" এর পরে রেখার পরিসীমা সন্নিবেশ করায়! " আপনি ঠিক পরে মুছতে পারেন যে। আপনি যদি এটি প্রয়োগ করেন তবে নীচের অনুচ্ছেদে:

1
2  Repellendus qui velit vel ullam!
3  ipsam sint modi! velit ipsam sint
4  modi! Debitis dolorum distinctio
5  mollitia vel ullam! Repellendus qui
6  Debitis dolorum distinctio mollitia
7  vel ullam! ipsam
8
9  More text around here

"! এপ" চাপ দেওয়ার পরে ফলাফলটি এরকম হবে:

:.,.+5

হিসাবে '।' (পয়েন্ট) অর্থ বর্তমান লাইন, বর্তমান লাইন এবং 5 লাইনগুলির মধ্যে পরিসীমাটি অপারেশনের জন্য ব্যবহৃত হবে। এখন আপনি বিকল্প কমান্ডটি আগের মতো যুক্ত করতে পারেন।

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

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


0

এই প্রশ্নের উত্তর দিতে:

:40,50s/foo/bar/g

40 তম লাইন এবং 50 তম লাইন (সমেত) এর মধ্যে এই লাইনে বার দিয়ে foo প্রতিস্থাপন করুন, যখন এই আদেশটি কার্যকর করা যায় আপনি বর্তমানে যে কোনও লাইনে থাকতে পারেন।

:50,40s/foo/bar/g

এছাড়াও কাজ করে, ভিম আপনাকে কনফার্মের জন্য জিজ্ঞাসা করবে এবং তারপরে আপনার জন্য প্রতিস্থাপনটি করবে যেমন আপনার প্রথম কমান্ড ইনপুট রয়েছে।

:,50s/foo/bar/g

আপনি বর্তমানে যে রেখাটি রয়েছেন এবং 50 তম লাইন (সমেত) এর মধ্যে এই লাইনে বার দিয়ে ফু প্রতিস্থাপন করুন। (আপনি যদি 50 তম লাইনের পরে লাইনে থাকেন তবে ভিএম আবার নিশ্চিত করার জন্য জিজ্ঞাসা করবে)

Elimipse এর vim এবং vrapper প্লাগইনের মধ্যে পার্থক্য পরিষ্কার করতে:

ভার্পারে নোট করুন

:,50s/foo/bar/g কমান্ড কাজ করবে না।

:50,40s/foo/bar/g নিশ্চিতকরণ না চেয়ে কাজ করবে।

(ভের্পার সংস্করণ 0.74.0 বা তার বেশি পুরানো)।


-5
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal
/sys/sim/source/gm/kg/jl/ls/owow/lsal

মনে করুন আপনি যদি উপরেরটি অন্য কোনও তথ্যের সাথে প্রতিস্থাপন করতে চান।

COMMAND(:%s/\/sys\/sim\/source\/gm\/kg\/jl\/ls\/owow\/lsal/sys.pkg.mpu.umc.kdk./g)

এতে উপরেরটি ( sys.pkg.mpu.umc.kdk.) দিয়ে প্রতিস্থাপন করা হবে ।


আমি নিশ্চিত না যে এটি আসলে প্রশ্নের উত্তর দিয়েছে। প্রশ্ন থেকে দেখা যাচ্ছে যে ব্যক্তি জিজ্ঞাসা করছেন তারা %sইনপুট পরিবর্তন করতে কীভাবে ব্যবহার করবেন তা সম্পর্কে ইতিমধ্যে সচেতন তবে এটি কীভাবে "আধা-বিশ্বব্যাপী" করতে হবে তা জানতে চান (অর্থাত্ তার স্পেসিফিকেশনটি 11-10-এর লাইনে নয় তবে 6-10 এবং 14- তে রয়েছে) 13)।
ব্র্যান্ডন বাক

1
এছাড়াও "কম্যান্ড" কী? এবং আপনি ঝুঁকিতে টুথপিক সিন্ড্রোমে ভুগছেন ।
মার্টিন টর্নোইজ

যে সিন্ড্রোম সারাতে, আপনি ডিফল্ট পরিবর্তে বিভেদক হিসাবে অন্য চরিত্র ব্যবহার করতে পারেন /, যেমন !, @, _::%s_/sys/sim/source/gm/kg/jl/ls/owow/lsal_sys.pkg.mpu.umc.kdk_g
MortezaE
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.