পুনরাবৃত্ত শেড অনুসন্ধান পরীক্ষা করে চালানোর আগে প্রতিস্থাপন করুন


13

ট্রায়াল পুনরাবৃত্তি অনুসন্ধান চালানোর এবং sedবাস্তবে এটি চালানোর আগে ব্যবহার করে প্রতিস্থাপন করার কোনও উপায় আছে কি ? আমি আসলে ফলাফলগুলি অনুসন্ধান করতে এবং প্রতিস্থাপনের আগে মুদ্রণ করতে চাই। এর ফলাফল প্রতিধ্বনি করার মতো কিছু,

grep -rl term1 . |xargs sed -i -e 's/term1/term2/'

ডেটাটির একটি অনুলিপি তৈরি করুন, আপনার আদেশটি চালান, ফলাফলটি পরীক্ষা করুন।
কুসালানন্দ

উত্তর:


10

আপনি sedছাড়া চালাতে পারেন -iএবং সাথে আউটপুট মাধ্যমে পদক্ষেপless

grep -rl --null term1 . | xargs -0 sed -e 's/term1/term2/' | less

তারপর চালানোর sedসঙ্গে -i.bakব্যাকআপ যা আপনি পরে বিবিধতা করতে তৈরি করতে

grep -rl --null term1 . | xargs -0 sed -i.bak -e 's/term1/term2/'
diff somefile.bak somefile
# verify changes were correct

সম্পাদনা: মতামত হিসাবে পরামর্শ হিসাবে ব্যবহার করুন grep --null | xargs -0। এটি নাল-বাইট দ্বারা ফাইলের নামগুলি বন্ধ করে দেয় যার ফলে এটি নিউলাইনের মতো অস্বাভাবিক অক্ষরযুক্ত ফাইলের নামগুলির জন্য নিরাপদ করে। হ্যাঁ, \nইউনিক্স ফাইলের একটি বৈধ অক্ষর। একমাত্র নিষিদ্ধ অক্ষরগুলি হ'ল স্ল্যাশ /এবং নুল চরিত্র\0


আকর্ষণীয়, আমি -i এর অর্থ সন্ধান করার চেষ্টা করেছি তবে এটি ম্যান সেডের অধীনে তালিকাভুক্ত হয়নি। আপনার সমাধান কাজ করেছে। সম্পূর্ণ ফাইল নয়, কেবল আপনার রেখার তালিকা তৈরির পক্ষে সর্বোত্তম উপায় কী হবে? কম পাইপ না করে আমি পাইপ করলাম | গ্রেপ টার্ম 2, যা বাছাইয়ের কাজ কিন্তু আমি পাশাপাশি আশ্চর্য চরিত্রের সাথে কিছু আউটপুট পেয়েছি।
ব্যবহারকারী 251482

@ ব্যবহারকারী 251482 - "পুরানো এবং নতুন ফাইলের মধ্যে একটি পার্থক্য" হিসাবে যেমন "লাইনগুলি কেবল তালিকাবদ্ধ করুন"?
গ্রেবনেকে

1
@ স্টাফেনচাজলাস হ্যাঁ, বা আরও ভাল grep -rl --nullযেহেতু ওপি ওএস নির্দিষ্ট করে না, এবং এর -Zঅর্থ বিএসডি / ওএসএক্স (ডিকম্প্রেস) এর থেকে আলাদা কিছু means --nullজিএনইউ এবং বিএসডি উভয় ক্ষেত্রেই সমান
21

1
@grebneke। ভাল কথা, তবে মনে রাখবেন যে ওপি GNU সেড সিনট্যাক্স ব্যবহার করছে, তাই আমরা ধরে নিতে পারি যে তিনি বিএসডি তে নেই। নোট করুন যে grepফ্রিবিএসডি এবং নেটবিএসডি-তে জিএনইউ গ্রেপ ( নেটবিএসডি-তে, -Zএখনও অর্থ --null(ম্যান পৃষ্ঠা অনুসারে) তবে আমি সম্মতি জানাই - নিল আরও বহনযোগ্য। এছাড়াও খেয়াল করুন যে
স্টাফেন চ্যাজেলাস

1
@ গ্রেবেনকে, এটি sed -i '' -e s/.../বিএসডি-তে রয়েছে sed(সেখানে কোনও বিকল্প বিকল্প নেই)
স্টাফেন চেজেলাস

5

পরিবর্তে sedসঙ্গে ব্যবহার করুনfindgrep

প্রথমত, আমি findবরং কর্মসংস্থান করব grep, এবং এটি তিনটি ভাল কারণে:

  1. findআরও সুনির্দিষ্ট ফাইল নির্বাচনের জন্য অনুমতি দেয়। উদাহরণস্বরূপ, grep -r string *.txtকেবলমাত্র বর্তমান ডিরেক্টরিতে ফাইলগুলি পাওয়া যাবে; উপ-ডিরেক্টরিগুলিতে নয়।
  2. findশক্তিশালী -execবিকল্পের সাথে আসে যা পুরো --null … |xargs 0নির্মাণের প্রয়োজনকে সরিয়ে দেয়।
  3. এর -readableএবং -writableঅপশনগুলি findঅ্যাক্সেস করা যায় না এমন ফাইলগুলিতে সময় অপচয় করা রোধ করবে।

ক্যাপচার পরীক্ষা

এটি বলেছিল, grepকী ধরা পড়বে তা দেখার জন্য প্রথম পরীক্ষার জন্য নিজেকে ndণ দেয়:

$ find . -exec grep term1 {} \;

বা আরও নির্দিষ্টভাবে:

$ find . -type f -name '*.txt' -readable -writable -exec grep term1 {} \;

শুকনো রান

এখন, একটি sedশুকনো রান নিয়ে এগিয়ে যান । sedবিকল্প -nজন্য একটি প্রতিশব্দ হয় --quietএবং pখুব শেষে sedঅভিব্যক্তি বর্তমান প্যাটার্ন স্থান প্রিন্ট করবে।

$ find . -exec sed -n 's/term1/term2/gp' {} \;

বা আরও নির্দিষ্টভাবে:

$ find . -type f -name '*.txt' -readable -writable -exec sed -n 's/term1/term2/gp' {} \;

ফাঁসি

সবকিছু ঠিক বলে মনে হলে, প্রতিস্থাপন ডেফিনিটিভ কমান্ড sedবিকল্প -nদ্বারা -i"জায়গায়" জন্য এবং সরিয়ে pশেষে।

$ find . -exec sed -i 's/term1/term2/g' {} \;

বা আরও নির্দিষ্টভাবে:

$ find . -type f -name '*.txt' -readable -writable -exec sed -i 's/term1/term2/g' {} \;

আরও findউদাহরণ

আরও findউদাহরণ এখানে পাওয়া যাবে

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