কীভাবে বদলে দেওয়া ফাইলগুলির ব্যাকআপ তৈরি করে সেড ইন-প্লেস প্রতিস্থাপন সম্পাদন করবেন?


13

আমি বর্তমান ওয়ার্কিং ডিরেক্টরিতে সমস্ত ফাইলে ব্যবহৃত একটি পদ প্রতিস্থাপন করতে নিম্নলিখিতটি চালিয়েছি:

$ find . -type f -print0 | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

এটি প্রতিস্থাপন শব্দটি সম্পাদন করেছে তবে এটি এমন .bupফাইলগুলির ফাইলও তৈরি করেছে যার Ms. Johnsonস্ট্রিং কখনও ছিল না ।

এই সমস্ত অপ্রয়োজনীয় ব্যাকআপ তৈরি না করে আমি কীভাবে বিকল্প সম্পাদন করব?


আমার কাছে
সেড

সংরক্ষণ এবং প্রস্থান করার আগে exচালানো এবং শর্তসাপেক্ষে (কেবলমাত্র ফাইলটি পরিবর্তন করা হয়) ব্যবহার করে সম্ভবত আরও ভাল পদ্ধতির সম্ভাবনা রয়েছে :!cp '%' '%.bup'। দৃষ্টিপাত মূল্য হতে পারে।
ওয়াইল্ডকার্ড

আমি লিখেছেন উপরে আমার ধারণা প্রশ্ন উপর viস্ট্যাক বিনিময়।
ওয়াইল্ডকার্ড

উত্তর:


6

আপনি ফাইলগুলির বিষয়বস্তুগুলি পরীক্ষা করতে পারেন এটি নিশ্চিত করার জন্য যে সেগুলি যখন sedচালিত হয় তখন প্রতিস্থাপন ঘটে will

find . \
    -type f \
    -exec grep -q 'Ms. Johnson' {} \; \
    -print0 |
xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

আপনি যদি এটি সম্পর্কে সত্যই চতুর হতে চান তবে আপনি এটিকে ব্যবহার করে পূর্ববর্তী হতে পারেন find:

grep -Z -l -r 'Ms. Johnson' |
    xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

1
আমি তোমাকে একটা প্রয়োজন মনে করেন '{}'শুধু আপনার সামনে \;যে -exec
জান্ডার

8

-execফাইন্ডে একটি অপারেটর রয়েছে যা একটি স্বেচ্ছাসেবক কমান্ড কার্যকর করে। আরও ভাল, -execএটি একটি পরীক্ষা , যাতে আপনি বেশ কয়েকটি -execগুলি একসাথে চেইন করতে পারেন , এবং যদি পূর্ববর্তী আদেশগুলি ব্যর্থ হয়, তবে পরবর্তীগুলি কার্যকর করা হবে না। স্ট্রিংটি {}বর্তমান ফাইলের নামের সাথে প্রতিস্থাপিত হয় এবং ;কমান্ডের শেষ চিহ্নিত করে। শেল হস্তক্ষেপ এড়ানোর জন্য আপনার উভয়কেই উদ্ধৃতি দেওয়া উচিত।

তাই:

find . -type f \
    -exec grep -q 'Ms. Johnson' '{}' \; \
    -exec sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g' '{}' \;

খালি ব্যবহার করতে আমার কখনও সমস্যা হয়নি।
এম্পেটাম্যাচাইন

1
@ এমফেটাম্যাচিন: আমার কাছেও নেই, তবে ম্যান পেজটি এটির পরামর্শ দেয়। এটি কোনও ক্যাশ জিনিস হতে পারে বা শেলগুলি থাকতে পারে (বাশ নয় এবং পসিক্স নয়) যারা {}ব্রেস প্রসারিত করার সময় নাল স্ট্রিংয়ে প্রসারিত হয়।
জান্ডার

4

আমি ম্যান পৃষ্ঠার দিকে তাকিয়েছি এবং সরাসরি এটি করার কোনও উপায় দেখিনি sed, কারণ আমি নিশ্চিত যে আপনি জিজ্ঞাসা করার আগেই করেছিলেন। আমি গ্রেপ ব্যবহার করে এটিকে ঘিরে কাজ করার বিভিন্ন উপায় দেখতে পাচ্ছি, তবে আমি মনে করি সবচেয়ে সহজ এটি:

grep -rlZ "Ms. Johnson" . | xargs -0 sed -i'.bup' -e's/Ms. Johnson/Mrs. Melbin/g'

-rপুনরাবৃত্তি
-lপ্রিন্ট ফাইলের
-Zনাম নাল দিয়ে শুধুমাত্র শেষ নাম


-1

দেখে মনে হচ্ছে আপনার প্রথমে আপনার অনুসন্ধানের পদগুলির সাথে মেলে এমন একটি ফাইলের তালিকা তৈরি করা দরকার।

search="test"
for match in $(find -type f -exec grep -l $search "{}" \;)
do sed -i'.bup' -e "/$search/ s/$search/Mrs. Melbin/g" "$match"
done

আপনি .প্রথম যুক্তি হিসাবে ভুলে গেছেন find। এছাড়াও, যেহেতু আমাকে খুব বেশিদিন আগেই আমাকে অবহিত করা হয়েছিল, আপনাকে আসলে উদ্ধৃত করা বা এড়ানোর দরকার নেই{}
কেভিন

ফাইলগুলির তালিকা তৈরি করবেন না এবং এতে কমান্ড প্রতিস্থাপন সম্পাদন করবেন না। প্রথমে findফাইলগুলির একটি নিউলাইন-বিচ্ছিন্ন তালিকা তৈরি করে, তারপরে শেলটি এই তালিকাটি কোনও সাদা স্থান (কেবল নিউলাইন নয়) এ ছিন্ন করে এবং তারপরে শেল প্রতিটি শব্দকে গ্লোব প্যাটার্ন হিসাবে বিবেচনা করে। এটি কেবল তখনই কাজ করে যদি আপনার ফাইলের নামগুলিতে সাদা স্থান বা থাকে না \[?*। এই পৃষ্ঠার অন্যান্য উত্তরগুলি কীভাবে এটি সঠিকভাবে করতে হয় তা দেখায়।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

@ কেভিন দ্য ফাইন্ডের .সাথে অপ্রয়োজনীয় (কমপক্ষে লিনাক্সের সন্ধান পাওয়া যায়) কারণ যখন ধরে নেওয়া হয় যে কোনও পথ আর্গুমেন্ট পাস না করে।
লেবেশদে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.