linux Grep और sed[duplicate] का उपयोग कर रिकर्सिव की सभी फ़ाइलों में स्ट्रिंग को ढूंढें और बदलें




bash recursion (4)

मुझे एक मिल रहा है

sed: -e expression #1, char 22: unterminated `s' command 

क्या मेरी लिपि में कोई समस्या है? इसके अलावा "पुरानी" में विशेष पात्र हैं

#!bin/bash
oldstring='<script>"[oldscript]"</script>'
newstring='<script>"[newscript]"</script>'
grep -rl $oldstring /path/to/folder | xargs sed -i s/$oldstring/$newstring/g

grep -rl SOSTITUTETHIS . | xargs sed -Ei 's/(.*)SOSTITUTETHIS(.*)/\1WITHTHIS\2/g'


GNU लोगों ने वास्तव में गड़बड़ कर दी जब उन्होंने grep को रिकर्सिव फ़ाइल खोजना शुरू किया। grep फाइलों में आरईएस ढूंढने और मिलान करने वाली रेखा को मुद्रित करने के लिए है (g / re / p याद है?) फ़ाइलों को खोजने के लिए नहीं। फ़ाइलों को ढूंढने के लिए एक बहुत ही स्पष्ट नाम के साथ एक बिल्कुल अच्छा उपकरण है। यूनिक्स मंत्र के साथ जो भी हुआ वह एक काम करता है और इसे अच्छी तरह से करता है?

वैसे भी, पारंपरिक यूनिक्स दृष्टिकोण (अनचाहे) का उपयोग करके आप जो भी करना चाहते हैं, वही है:

find /path/to/folder -type f -print |
while IFS= read -r file
do
   awk -v old="$oldstring" -v new="$newstring" '
      BEGIN{ rlength = length(old) }
      rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
      { print }
   ' "$file" > tmp &&
   mv tmp "$file"
done

ऐसा नहीं है कि sed और grep के बजाय awk / index () का उपयोग करके आप उन सभी आरई मेटाएक्टैक्टर्स से बचने की आवश्यकता से बचें जो आपके पुराने या आपकी नई स्ट्रिंग में दिखाई दे सकते हैं और अपने चरित्र को डिलीमीटर के रूप में उपयोग करने के लिए एक चरित्र को समझ सकते हैं जो ' टी आपके पुराने या नए तारों में दिखाई नहीं दे रहा है, और आपको grep को चलाने की आवश्यकता नहीं है क्योंकि प्रतिस्थापन केवल उन फ़ाइलों के लिए होगा जो आपके इच्छित स्ट्रिंग को रखते हैं। यदि आप फ़ाइल को संशोधित नहीं करते हैं, तो आप फ़ाइल टाइमस्टैम्प को बदलने के लिए नहीं चाहते हैं, तो एमवी करने से पहले या fgrep -q में फेंकने से पहले बस tmp और मूल फ़ाइल पर एक diff करें awk।

चेतावनी: उपर्युक्त फाइल नामों के लिए काम नहीं करेगा जिसमें न्यूलाइन हैं। यदि आपके पास हैं तो हमें बताएं और हम आपको दिखा सकते हैं कि उन्हें कैसे संभालना है।


grep -rl $oldstring . | xargs sed -i "s/$oldstring/$newstring/g"




grep