অনুসন্ধান এবং প্রতিস্থাপনের জন্য সেড এবং গ্রেপ / এগ্রিপ ব্যবহার করা


97

আমি egrep -Rপ্রায় 10 ইউনিয়ন সমন্বিত একটি নিয়মিত প্রকাশের পরে ব্যবহার করছি , যেমন: .jpg | .png | .gifইত্যাদি এটি ভালভাবে কাজ করে, এখন আমি এর সাথে পাওয়া সমস্ত স্ট্রিং প্রতিস্থাপন করতে চাই.bmp

আমি এমন কিছু ভাবছিলাম

egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form

সুতরাং এখানে সমস্যাটি হ'ল আমি কীভাবে একই ইউনিয়ন নিয়মিত প্রকাশ sedকরতে পারি এবং যে ফাইলটি থেকে ইনপুট পাওয়া যায় তার পরিবর্তনগুলি সংরক্ষণ করতে আমি কীভাবে এটি বলি।


4
ডিরেক্টরি হায়ারার্কির একাধিক ফাইল জুড়ে অনুসন্ধান এবং প্রতিস্থাপনের উপায়গুলি অনুসন্ধান করার সময় আমি এই প্রশ্নটি পেয়েছি। আমার পরিস্থিতিতে অন্যদের জন্য, rpl চেষ্টা করুন ।
টাইটানিয়ামডেকয়

আপনাকে ধন্যবাদ rpl কাজ করে এবং এটি মনে রাখা সত্যিই সহজ .. শুধু rpl পুরানো_ স্ট্রিং new_string টার্গেট_ফাইলস।
সিজারপাচন

উত্তর:


183

এই আদেশটি ব্যবহার করুন:

egrep -lRZ "\.jpg|\.png|\.gif" . \
    | xargs -0 -l sed -i -e 's/\.jpg\|\.gif\|\.png/.bmp/g'
  • egrep: বর্ধিত নিয়মিত এক্সপ্রেশন ব্যবহার করে মিলিত লাইনগুলি সন্ধান করুন

    • -l: কেবলমাত্র ফাইলের নামের সাথে মিল রয়েছে list

    • -R: সমস্ত প্রদত্ত ডিরেক্টরিতে পুনরাবৃত্তভাবে অনুসন্ধান করুন

    • -Z: \0রেকর্ড বিভাজক হিসাবে ব্যবহার করুন

    • "\.jpg|\.png|\.gif": একটি স্ট্রিং এর সাথে মেলে ".jpg", ".gif"বা".png"

    • .: বর্তমান ডিরেক্টরিতে অনুসন্ধান শুরু করুন

  • xargs: আর্গুমেন্ট হিসাবে স্টিডিনের সাথে একটি কমান্ড কার্যকর করুন

    • -0: \0রেকর্ড বিভাজক হিসাবে ব্যবহার করুন । এটি গুরুত্বপূর্ণ মেলে হয় -Zএর egrepএবং স্পেস এবং ইনপুট ফাইলের নামের মধ্যে নতুন লাইন দিয়ে বোকা বানানো হচ্ছে এড়ানো।

    • -l: পরামিতি হিসাবে কমান্ড প্রতি একটি লাইন ব্যবহার করুন

  • sed: গুলি tream ইডি itor

    • -i: ব্যাকআপ না করে আউটপুট দিয়ে ইনপুট ফাইলটি প্রতিস্থাপন করুন

    • -e: নিম্নলিখিত যুক্তিটি প্রকাশ হিসাবে ব্যবহার করুন

    • 's/\.jpg\|\.gif\|\.png/.bmp/g': স্ট্রিং এর সমস্ত সংঘটন প্রতিস্থাপন ".jpg", ".gif"বা ".png"সঙ্গে".bmp"


এটি ছাড়া সমস্ত কাজ করে সেড অংশে। আমি বুঝতে পারছি না যেহেতু এটি বোধগম্য হয়েছে ... xargs এর -l অংশটি আমাকে ত্রুটি দিচ্ছিল তাই আমি এটিকে বের করে আনলাম, এটি কি সম্পর্কিত হতে পারে?
ওরি

আমি দেখতে পেয়েছি যে এই কমান্ডটি প্রক্রিয়াজাত সমস্ত ফাইলের শেষে একটি নতুন লাইন যুক্ত করে।
টাইটানিয়ামডেকয়

@ টাইটানামডেকয়: আমি এই আচরণটি পুনরুত্পাদন করতে পারিনি। আপনি সেডের কোন সংস্করণ ব্যবহার করছেন এবং আপনি কোন ওএসে আছেন?
ডেভিড স্মিট

4
@ ডেভিডস্মিট: আপনি সম্ভবত sed -rবর্ধিত নিয়মিত প্রকাশের জন্য ব্যবহার করতে চান । এই মুহুর্তে, প্যাটার্নটি egrep এ যা ব্যবহার করা হবে তার সাথে মেলে এবং আপনি এটি পুনঃব্যবহারের জন্য কোনও ভেরিয়েবলের মধ্যে রাখতে চান।
বুকজোর

এই কমান্ডটি আমার তৈরি লাইব্রেরির জন্য আমার অ্যাপ্লিকেশন থেকে শিরোনামের ফাইলগুলি অনুলিপি করার কয়েক ঘন্টা কাজ বাঁচিয়েছে। এটি দুর্দান্ত :) :) এখানে কমান্ডটি আমি ব্যবহার করেছি egrep -lRZ "\ .h $"। | xargs -0 tar -cvf headers.tar | (CP headers.tar হেডার; সিডি হেডার; headers.tar XF আলকাতরা;)
দ্য অলস সংকেতপদ্ধতিরচয়িতা

11

সত্যিই, যথাযথ কাজের জন্য আমি যতটা ভালবাসি, এটি অবশ্যই পার্লের জন্য একটি কাজ - এটি এই ধরণের ওয়ান-লাইনারের পক্ষে সত্যই আরও শক্তিশালী, বিশেষত "এটি যেখানে আসে সেখান থেকে ফিরে এটি লেখার জন্য" (পার্লের -iসুইচ এটি করে আপনি এবং allyচ্ছিকরূপে আপনাকে পুরানো সংস্করণ যেমন: .bak সংযুক্ত করে কেবল তার -i.bakপরিবর্তে ব্যবহার করতে দেয়) রাখতে দেয়।

perl -i.bak -pe 's/\.jpg|\.png|\.gif/.jpg/

বদলে জটিল কাজ করার পরিবর্তে (এমনকি সেখানে সম্ভব হলেও) বা অজানা ...


6
সেড পার্ল-এর মতোই ব্যবহার করে।
স্টোবার

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

10

এটি করার আরেকটি উপায়

find . -name *.xml -exec sed -i "s/4.6.0-SNAPSHOT/5.0.0-SNAPSHOT/" {} \;

উপরের আদেশটি সম্পর্কে কিছু সহায়তা

অনুসন্ধানটি নির্দেশিত বর্তমান ডিরেক্টরিতে আপনার জন্য অনুসন্ধান করবে .

-name আমার ক্ষেত্রে ফাইলের নাম এটির pom.xML ওয়াইল্ড কার্ড দিতে পারে।

-exec এক্সিকিউট

sed স্ট্রিম এডিটর

-i অবহেলার ঘটনা

s বিকল্প জন্য হয়

/4.6.0.../ স্ট্রিং অনুসন্ধান করা হবে

/5.0.0.../ স্ট্রিং প্রতিস্থাপন করা হবে


সম্ভবত ততটা শক্তিশালী নয় - তবে এটি গ্রহণযোগ্য উত্তরের চেয়ে বুঝতে আমার পক্ষে অনেক সহজ
icc97

5

আমি কমান্ড কোন আমার জন্য কাজ এই পৃষ্ঠাতে পাই নি: কিন্তু সমাধান সব ফাইল এটা প্রক্রিয়া শেষে একটি newline যোগ করেছে Perl সমাধান খুঁজে থেকে যথেষ্ট আর্গুমেন্ট গ্রহণ করতে পারেনি। আমি এই সমাধানটি পেয়েছি যা নিখুঁতভাবে কাজ করে:

find . -type f -name '*.[hm]' -print0 
    | xargs -0 perl -pi -e 's/search_regex/replacement_string/g'

এই বর্তমান ডিরেক্টরির গাছটা recurse এবং প্রতিস্থাপন করবে search_regexসঙ্গে replacement_stringকোন ফাইল মধ্যে বিভক্তি .hবা .m

আমি অতীতেও এই উদ্দেশ্যে আরপিএল ব্যবহার করেছি


0

লুপের জন্য কিছু ব্যবহার করে দেখুন try

 for i in `egrep -lR "YOURSEARCH" .` ; do echo  $i; sed 's/f/k/' <$i >/tmp/`basename $i`; mv /tmp/`basename $i` $i; done

সুন্দর নয়, তবে করা উচিত।


4
xargs অবশ্যই এখানে আরও উপযুক্ত।
নাথান ফেলম্যান

4
এবং |while read iপ্যাটার্নটি ব্যবহার স্ট্রিমিং সক্ষম করে এবং যখন egrep এর ফলাফল খুব দীর্ঘ হয়ে যায় দৈর্ঘ্যের সীমাবদ্ধতাগুলি এড়াতে পারে
ডেভিড স্মিট

0

আমার ব্যবহারের ক্ষেত্রে আমি প্রতিস্থাপন করতে চেয়েছিলেন foo:/Drive_Letterসঙ্গে foo:/bar/baz/xyz আমার ক্ষেত্রে আমি নিম্নলিখিত কোড সহ এটা করতে সক্ষম হন। আমি একই ডিরেক্টরিতে ছিলাম যেখানে প্রচুর পরিমাণে ফাইল ছিল।

find . -name "*.library" -print0 | xargs -0 sed -i '' -e 's/foo:\/Drive_Letter:/foo:\/bar\/baz\/xyz/g'

আশা করি যে সাহায্য করেছে।

আপডেট আপডেট | ফু: / ড্রাইভ_লেটার: | ফু: / বা / বাজ / এক্সজি | জি


আপনি সেড কমান্ডের জন্য অন্যান্য সীমানা ব্যবহারকারীর ব্যবহার করতে পারেন, এবং এটি করার ফলে পথের নামগুলি আরও সুন্দর হয়:sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'
কেভিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.