সমস্ত প্রকল্প ফাইল জুড়ে ভিমে অনুসন্ধান এবং প্রতিস্থাপন করুন


117

আমি ভিমের সমস্ত প্রকল্প ফাইল জুড়ে অনুসন্ধান-এবং-প্রতিস্থাপন (নিশ্চিতকরণ সহ) করার সর্বোত্তম উপায়টি সন্ধান করছি। "প্রকল্প ফাইলগুলি" দ্বারা আমি বর্তমান ডিরেক্টরিতে ফাইলগুলি বোঝাতে চাইছি যার মধ্যে কিছুগুলি খোলার দরকার নেই।

এটি করার একটি উপায় হ'ল বর্তমান ডিরেক্টরিতে থাকা সমস্ত ফাইল খালি খোলা থাকা:

:args ./**

এবং তারপরে অনুসন্ধান করুন এবং সমস্ত খোলা ফাইলগুলিতে প্রতিস্থাপন করুন:

:argdo %s/Search/Replace/gce

যাইহোক, আমি যখন এটি করি তখন ভিমের মেমরির ব্যবহারটি কয়েক ডজন এমবি থেকে ২ জিবি ওপরে যায়, যা আমার পক্ষে কাজ করে না।

আমার কাছে ইজিগ্রিপ প্লাগইন ইনস্টল করা আছে, তবে এটি প্রায়শই কাজ করে না - হয় এটি সমস্ত ঘটনা খুঁজে পায় না, বা আমি চাপ না দেওয়া পর্যন্ত এটি কেবল স্তব্ধ হয়ে যায় CtrlC। এ পর্যন্ত আমার পছন্দের পথ এই কাজের এটি সম্পন্ন করার জন্য -Ack, grep অনুসন্ধান শব্দ জন্য, এটা quickfix উইন্ডোর মেয়াদ রয়েছে এবং সামনে খোলা হয় নি, এবং পরিশেষে কোনো ফাইল খুলতে ব্যবহার :bufdo %s/Search/Replace/gce

আমি একটি ভাল, কার্যকরী প্লাগইন খুঁজছি যা এর জন্য ব্যবহার করা যেতে পারে অথবা বিকল্পভাবে একটি আদেশ / আদেশের ক্রম যা এখন আমি ব্যবহার করছি তার চেয়ে সহজ হবে।


1
@ ক্যাসাবেল যেহেতু আপনি এই মন্তব্যটি লিখেছেন তাই একটি vi.stackexchange.com সাইট রয়েছে।
ফ্লাইম

উত্তর:


27

গ্রিপ্লেস আমার পক্ষে ভাল কাজ করে।

গিথুবে একটি প্যাথোজেন রেডি সংস্করণও রয়েছে।


8
এটি ইনস্টল করা হয়েছে, আমি অন্যান্য কমান্ডগুলি দেখতে পাই :Gsearchএবং :Gbuffersearchউপস্থিত দেখি , কিন্তু আমি টাইপ করলে :Greplaceআমি পাই Not an editor command: Greplace
রমন তাইগ

দস্তাবেজ অনুসারে বাক্য :Gsearch [<grep-option(s)>] [[<pattern>] [<filename(s)>]]:Gsearch -r pattern dir/
গঠনটি

আমি গ্রিপ্লেস সম্পর্কে যে জিনিসটি ঘৃণা করি তা হ'ল প্যাটার্নটি যদি ফাইলনামে থাকে তবে গ্রেপ্লেস ব্যর্থ হয়, কারণ আপনি ফাইলের নামটিতেও এটি প্রতিস্থাপন করেন।
ড্যানিয়েল

2
এখানে 6 বছর পরে এখানে অস্বাভাবিক কিছু নয়, তবে এই প্লাগইনটি 3+ বছর পূর্বে কিছু নতুন উত্তর ( github.com/yegappan/greplace ) সর্বশেষ আপডেটের তুলনায় মারাত্মকভাবে পুরানো । আমি সিড দ্বারা বিল্টিন সমাধানটি পরীক্ষা করে দেখতে পারি: stackoverflow.com/a/38004355/2224331 (এটি অন্য কোনও অ্যাকাউন্টে আমি নই, কেবল একটি কাকতালীয়ভাবে: পি)
সিডওফসি

99

এখানে অন্য বড় বিকল্পটি কেবল ভিএম ব্যবহার না করা:

sed -i 's/pattern/replacement/' <files>

অথবা আপনার কাছে যদি ফাইলগুলির একটি তালিকা তৈরির কিছু উপায় থাকে তবে সম্ভবত এটির মতো:

find . -name *.cpp | xargs sed -i 's/pattern/replacement/'
grep -rl 'pattern1' | xargs sed -i 's/pattern2/replacement/'

এবং তাই!


ধন্যবাদ! আমার এই পুরানো স্কুল কমান্ড লাইনের স্টাফগুলি শিখতে হবে। আমি মনে করি এটিই সেরা উত্তর। এই রেজিক্সগুলি কি পার্ল রেজেক্সেস বা ভিম রেজেক্সেস বা অন্য কোনও ধরণের রেইজেক্স?
এরিক জনসন

2
@ এরিক জনসন: তারা ... sedরেজিগেসস, যা মূলত POSIX.2 বেসিক নিয়মিত এক্সপ্রেশন, তবে ঠিক নয় (এটি ম্যানপেজে রয়েছে) - তারা নিউলাইনগুলি \nএবং এই জাতীয় কিছু অন্যান্য জিনিসগুলির সাথে মিল রাখতে দেয়। তারা তাই grepনিয়মিত এক্সপ্রেশন হিসাবে প্রায় একই ।
ক্যাস্যাবেল

সেড কমান্ডে আপনার কোনও কারণ আছে? ম্যান পেজটি বলছে এটি কোনও এক্সটেনশান নির্দিষ্ট করার জন্য, তবে আপনি আসলে কোনওটি নির্দিষ্ট করে দেখেন না।
ডেভেকোর

ঠিক আছে এটি দেখতে আসলে 's / প্যাটার্ন / রিপ্লেসমেন্ট /' হ'ল এক্সটেনশন, আমার মনে হয় আমি এখন বুঝতে পেরেছি।
ডেভেকোর

11
ম্যাক ওএস এক্স-তে আমার পক্ষে find . -type f | LANG=C xargs sed -i '' 's/SEARCH/REPLACE/g'
একমাত্র সেড

74

সম্পাদনা: cfdoকমান্ডের পরিবর্তে কমান্ডের পরিবর্তে কমান্ড ব্যবহার করুন cdoযা এটি সম্পাদন করতে চালিত হবে (কারণ cdoপ্রতিটি উপাদানটিতে cfdoকমান্ড চালায় এবং প্রতিটি ফাইলের কমান্ড চালায়)

সাম্প্রতিক যোগ হওয়া cdoকমান্ডকে ধন্যবাদ , আপনি এখন grepইনস্টল করা যেকোনো সরঞ্জাম ব্যবহার করে দুটি সাধারণ কমান্ডে এটি করতে পারেন। কোন অতিরিক্ত প্লাগইন প্রয়োজন!:

1. :grep <search term>
2. :cdo %s/<search term>/<replace term>/gc
3. (If you want to save the changes in all files) :cdo update

( cdoআপনার grepকমান্ডটি জনপ্রিয় করে তোলে এমন কুইকফিক্স তালিকার প্রতিটি শর্তে প্রদত্ত আদেশটি কার্যকর করে ))

( cআপনি যদি প্রতিবার নিশ্চিত না করে প্রতিটি অনুসন্ধান শব্দটি প্রতিস্থাপন করতে চান তবে দ্বিতীয় কমান্ডের শেষে অপসারণ করুন )


12
এছাড়াও আপনি :cdo updateসমস্ত ফাইলের পরিবর্তনগুলি সংরক্ষণ করতে যোগ করতে পারেন ।
ঝে লি

1
তবে বর্তমান বাফারটি সংশোধন করা হলে পরবর্তী বাফারে স্যুইচ করার আগে প্রতিবার সেভ না করা সতর্ক করার জন্য এটি বিরতি দেয়।
lfree

1
@ ধন্যবাদ, আমি উত্তরে এটি যোগ করেছি; @ ফ্রি আমি ব্যক্তিগতভাবে প্রতিটি পরিবর্তনের নিশ্চয়তা দিতে পছন্দ করি তবে এটি সন্ধানের জন্য cদ্বিতীয় কমান্ডের শেষে (কেবল ব্যবহার করুন g) সরিয়ে ফেলতে এবং নিশ্চিতকরণের জন্য জিজ্ঞাসা না করে প্রতিস্থাপন করতে পারেন
সিড

1
: সিডো% s / অনুসন্ধান শব্দ / প্রতিস্থাপন শব্দ / জি কেবল প্রথম ঘটনাটি প্রতিস্থাপন করে তবে আমার
ভিমে

3
ব্যবহার করার জন্য update: আমি বাধ্য ছিলামcdo %s/<search term>/<replace term>/g | update
গেব

34

GNU সাবসেটের চেয়ে আরও শক্তিশালী পূর্ণ পার্ল নিয়মিত এক্সপ্রেশনগুলির সুবিধা গ্রহণের জন্য আমি এই সমস্যাটি সমাধান করার জন্য আক্ক এবং পার্ল ব্যবহার করার সিদ্ধান্ত নিয়েছি।

ack -l 'pattern' | xargs perl -pi -E 's/pattern/replacement/g'

ব্যাখ্যা

ACK

ACK একটি ভয়ঙ্কর কমান্ড লাইন টুল একটি মিশ্রণ হয় না grep, findএবং পূর্ণ পার্ল রেগুলার এক্সপ্রেশনের (শুধুমাত্র গনুহ উপসেট)। এটি খাঁটি পার্লে লিখিত, এটির দ্রুত, এটি সিনট্যাক্স হাইলাইট করেছে, প্রথাগত কমান্ড লাইন সরঞ্জামগুলির তুলনায় উইন্ডোজ এবং প্রোগ্রামারগুলিতে তার বন্ধুত্বের সাথে কাজ করে। এটি দিয়ে উবুন্টুতে ইনস্টল করুন sudo apt-get install ack-grep

xargs

Xargs একটি পুরানো ইউনিক্স কমান্ড লাইন সরঞ্জাম। এটি স্ট্যান্ডার্ড ইনপুট থেকে আইটেমগুলি পড়ে এবং স্ট্যান্ডার্ড ইনপুট জন্য পড়া আইটেমগুলির পরে নির্দিষ্ট কমান্ড কার্যকর করে। সুতরাং মূলত অ্যাক দ্বারা উত্পাদিত ফাইলগুলির তালিকা perl -pi -E 's/pattern/replacemnt/g'কমান্ডের শেষে যুক্ত করা হচ্ছে ।

perl -pi

পার্ল একটি প্রোগ্রামিং ভাষা। -P বিকল্পটির ফলে পার্লকে আপনার প্রোগ্রামের চারপাশে একটি লুপ তৈরি করতে পারে যা ফাইলের নাম আর্গুমেন্টগুলির দ্বারা পুনরাবৃত্তি করে। -I বিকল্পটি পার্লকে জায়গায় ফাইলটি সম্পাদনা করে। ব্যাকআপগুলি তৈরি করতে আপনি এটি সংশোধন করতে পারেন। -E বিকল্পটি পার্লকে প্রোগ্রাম হিসাবে নির্দিষ্ট কোডের এক লাইন সম্পাদন করে। আমাদের ক্ষেত্রে প্রোগ্রামটি কেবল একটি পার্ল রেজেক্সের বিকল্প। পার্ল কমান্ড লাইন অপশন সম্পর্কিত আরও তথ্যের জন্য perldoc perlrun। পার্ল সম্পর্কিত আরও তথ্যের জন্য http://www.perl.org/ দেখুন


আমি এই উত্তরটি পছন্দ করি কারণ এটি এমনকি সাইগউইনের লাইন শেষের সাথেও কাজ করে। মনে রাখবেন যে এটি পরিবর্তিত লাইনের শেষে একটি add r যুক্ত করে, তবে সেড ব্যবহার করার সময় এটি প্রতিটি নতুনলাইন প্রতিস্থাপন করবে , আপনার ডিফগুলি অকেজো করে তুলবে । পার্ল কিছুটা বুদ্ধিমান এবং অনুসন্ধান এবং প্রতিস্থাপনের জন্য এটি সত্যিই দুর্দান্ত এক-লাইনার। ধন্যবাদ!
অ্যান্ড্রু

@ অ্যান্ড্রু, আমি নিশ্চিত না যে আপনার ক্ষেত্রে ঠিক কী ভুল হচ্ছে। এটি কি আপনাকে আপনার রেজেক্সপসে \ n এর পরিবর্তে use R ব্যবহার করতে সহায়তা করবে? Perldoc.perl.org/perlrebackslash.html# মিসে \ আর বিভাগটি দেখুন । এছাড়াও perldoc.perl.org/perlre.html# নিয়মিত- এক্সপ্রেসন ব্যবহার করে দেখুন । পার্ল চূড়ান্তভাবে ক্রস প্ল্যাটফর্ম এবং আমি নিশ্চিত ম্যাংলড লাইনের সমাপ্তি না শেষ করার কোনও উপায় আছে।
এরিক জনসন

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

যদি ফাইলের পথে ফাঁকা স্থান থাকে?
শেঞ্জি

23

সম্ভবত এটি করুন:

:noautocmd vim /Search/ **/*
:set hidden
:cfirst
qa
:%s//Replace/gce
:cnf
q
1000@a
:wa

ব্যাখ্যা:

  • :noautocmd vim /Search/ **/*Speed গতির স্বার্থে অটোকিম্ডস ( ) ট্রিগার না করে সিডব্লিউডির সমস্ত উপ-ডিরেক্টরিতে সমস্ত ফাইলের নিদর্শন (এর vimজন্য একটি সংক্ষেপণ vimgrep) pattern:noautocmd
  • :set hidden Mod পরিবর্তিত বাফারগুলি উইন্ডোতে প্রদর্শিত না হওয়ার অনুমতি দিন (আপনার ভিআরসিআর হতে পারে)
  • :cfirst Search প্রথম অনুসন্ধানের ফলাফলটিতে ঝাঁপ দাও
  • qa রেজিস্টার মধ্যে একটি ম্যাক্রো রেকর্ডিং শুরু ⇒ একটি
  • :%s//Replace/gceSearch সর্বশেষ অনুসন্ধানের প্যাটার্নের সমস্ত উপস্থিতি (এখনও /Search/সেই সময়ে) প্রতিস্থাপন করুন Replace:
    • একই লাইনে কয়েকবার ( gপতাকা)
    • ব্যবহারকারীর নিশ্চয়তার সাথে ( cপতাকা)
    • কোনও ত্রুটি ছাড়াই যদি কোনও প্যাটার্ন পাওয়া যায় না ( eপতাকা)
  • :cnfvimকমান্ড দ্বারা তৈরি তালিকার পরবর্তী ফাইলটিতে ঝাঁপুন
  • q Recording ম্যাক্রো রেকর্ডিং বন্ধ করুন
  • 1000@a Register 1000 বার নিবন্ধিত ম্যাক্রো খেলুন
  • :wa All সমস্ত পরিবর্তিত বাফার সংরক্ষণ করুন

* সম্পাদনা করুন * ভিম 8 উপায়:

উইম 8 দিয়ে শুরু করার সাথে সাথে আরও ভাল উপায় রয়েছে, যেমন :cfdoকুইকফিক্স তালিকার সমস্ত ফাইলের পুনরাবৃত্তি:

:noautocmd vim /Search/ **/*
:set hidden
:cfdo %s//Replace/gce
:wa

আপনি ব্যাখ্যা করতে চান যে আমাদের জন্য আরও কম প্রাণবন্ত। আপনার প্রতিবার এই "সিকোয়েন্স" করার দরকার থাকলে তা আমার কাছে পরিষ্কার নয়। আমি দ্রুত আমার মরিচা পুরানো ডেলফি 5 ব্যবহার করে যাচ্ছি তাই অবশ্যই আমার অবশ্যই কিছু অনুপস্থিত।
লাইভেন কের্মসেকার্স

1
@ লাইভেন: আপনি ঠিক বলেছেন, মন্তব্য না করেই এটি কিছুটা অস্পষ্ট। আমি কিছু ব্যাখ্যা বিকাশ করব।
বেনোইট

+1 তবে যদিও vimআমাকে অনেক কিছুর জন্য বিজয়ী করেছে, আমি মনে করি আমি এটি দিয়ে পাওয়ারগ্রপে আঁকড়ে থাকব।
লিভেন কেরসমেকার্স

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

আমি এটিকে চিহ্নিত করেছি কারণ কারও কাছে প্রশ্ন জিজ্ঞাসা করার স্তর এবং এই উত্তরটি বোঝার জন্য প্রয়োজনীয় স্তরের মধ্যে বৈষম্যের কারণে এটি আরও বিভ্রান্তি সৃষ্টি করে।
লয়েড মুর

22

:argsশেল কমান্ড থেকে পপুলেট করুন

শেল কমান্ডের মাধ্যমে ফাইল সরবরাহ করা সম্ভব (কিছু অপারেটিং সিস্টেমের 1 ) তে সম্ভব :args

উদাহরণস্বরূপ, আপনি যদি অ্যাক 2 ইনস্টল করে থাকেন,

:args `ack -l pattern`

আকাকে 'প্যাটার্ন' সম্বলিত ফাইলগুলির একটি তালিকা ফিরিয়ে দিতে এবং আর্গুমেন্ট তালিকায় রাখার জন্য জিজ্ঞাসা করবে।

অথবা প্লেইন ওল 'গ্রেপ দিয়ে আমি অনুমান করি এটি হ'ল:

:args `grep -lr pattern .`  


তারপরে আপনি কেবল :argdoওপি দ্বারা বর্ণিত হিসাবে ব্যবহার করতে পারেন :

:argdo %s/pattern/replacement/gce


জনপূর্ণ করুন :argsquickfix তালিকা থেকে

একটি সরল ব্যবহারকারী সংজ্ঞায়িত কমান্ড বর্ণিত সম্পর্কিত প্রশ্নের সাথে নেলস্ট্রমের উত্তরও পরীক্ষা করে দেখুন যা বর্তমান কুইকফিক্স তালিকা থেকে আরগলিস্টকে জনপ্রিয় করে তোলে। এটি অনেকগুলি কমান্ড এবং প্লাগইনগুলির সাথে দুর্দান্ত কাজ করে যার আউটপুট কুইকফিক্স তালিকায় শেষ হয় ( :vimgrep, :Ack3 , :Ggrep4 )।

একটি প্রকল্পের প্রশস্ত অনুসন্ধান সম্পাদনের ক্রমটি এর পরে এটি করা যেতে পারে:

:vimgrep /pattern/ **/*
:Qargs 
:argdo %s/findme/replacement/gc

:Qargsব্যবহারকারী সংজ্ঞায়িত কমান্ডের কাছে কলটি কোথায় আছে যা কুইকফিক্স তালিকা থেকে আরগলিস্টকে পপুলেট করে।

আপনি পরবর্তী আলোচনায় লিঙ্কগুলিও খুঁজে পাবেন প্লাগইনগুলির যা এই কর্মপ্রবাহটি 2 বা 3 কমান্ডে নামায়।

লিংক

  1. : h {আরগলিস্ট} - vimdoc.sourceforge.net/htmldoc/editing.html#{arglist}
  2. ack - bestthangrep.com/
  3. ack.vim - github.com/mileszs/ack.vim
  4. পলাতক - github.com/tpope/vim-fugitive

1
লেখার সমস্যা নিয়ে প্রথম ফাইলের পরে আরগডো থামে
ফ্র্যাঙ্কস্টার


5

আপনি বহিরাগত নির্ভরতা প্রবর্তনের কিছু মনে না করেন, আমি একটি প্লাগইন brewed আছে ctrlsf.vim (উপর নির্ভর করে ACK বা AG ) কাজ করার।

এটি এসকে / এজি থেকে অনুসন্ধানের ফলাফলকে ফর্ম্যাট এবং প্রদর্শন করতে পারে এবং ফলাফল পরিবর্তনে আপনার পরিবর্তনগুলি ডিস্কের প্রকৃত ফাইলগুলিতে সিঙ্ক্রোনাইজ করতে পারে।

সম্ভবত নিম্নলিখিত ডেমো আরও ব্যাখ্যা করে

ctrlsf_edit_demo


3
1. :grep <search term> (or whatever you use to populate the quickfix window)
2. :cfdo %s/<search term>/<replace term>/g | update

পদক্ষেপ 1 আপনার পছন্দসই আইটেমগুলির সাথে কুইকফিক্স তালিকাটি পপুলেট করে। এই ক্ষেত্রে, এটা অনুসন্ধান পদের মাধ্যমে পরিবর্তন করতে চান সঙ্গে প্রচারিত হচ্ছে grep

cfdoকুইকফিক্স তালিকার প্রতিটি ফাইলে নিম্নলিখিত কমান্ডটি চালায়। :help cfdoবিশদ জন্য টাইপ করুন।

s/<search term>/<replace term>/gপ্রতিটি পদ প্রতিস্থাপন করে। /gমানে ফাইলের প্রতিটি ঘটনা প্রতিস্থাপন করুন।

| update প্রতিস্থাপনের পরে ফাইলটি সংরক্ষণ করে।

আমি এই উত্তর এবং এর মন্তব্যের ভিত্তিতে এটি একসাথে ছুঁড়েছি , তবে অনুভব করেছি যে এটি সমস্ত জায়গাতেই তার নিজস্ব উত্তর প্রাপ্য।


নিওভিমে আমার জন্য উপরের ২ লাইনে একটি সামান্য সংশোধন করা দরকার: 2. :cfdo %s/<search term>/<replace term>/g | updateছাড়া %, কেবলমাত্র প্যাটার্নটির প্রথম ঘটনাটি প্রতিস্থাপন করা হয়েছে।
করিম এরগাওয়াই

ধন্যবাদ কারিম। আমি %sনিয়মিত ভিমে কাজ করে উত্তরটি আপডেট করেছি updated
কাইল হিরোনিমাস

0

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

উপর ভিত্তি করে @Jefromi দ্বারা উত্তর আমি একটি কী-বোর্ড শর্টকাট, যা আমি ভালো আমার .vimrc ফাইল শুরু হয়ে গিয়েছিল তৈরি করেছি

nmap <leader>r :!grep -r -l  * \| xargs sed -i -e 's///g'

এখন ভিএম থেকে, নেতার + স্ট্রোকের সময় আমি কমান্ডটি ভিমে লোড করি, যা আমি নীচের মত সম্পাদনা করি,

:!grep -r -l <find> <file pattern> | xargs sed -i -e 's/<find>/<replace>/g'

সুতরাং, আমি একটি একক কমান্ডের সাথে প্রতিস্থাপনটি করি এবং আরও গুরুত্বপূর্ণভাবে ভিআইএম এর মধ্যে


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