/ / वांछित फ़ाइलों में पैटर्न को बदलने के लिए एक शेल के भीतर SED का उपयोग करना [डुप्लिकेट] - बैश, शेल, सेड

वांछित फ़ाइलों में पैटर्न को प्रतिस्थापित करने के लिए एक खोल के भीतर SED का उपयोग करना [डुप्लिकेट] - बैश, खोल, sed

मेरे पास नीचे लिखी एक बैश शेल स्क्रिप्ट है:

#!/bin/bash
#arg1: pattern to be found
#arg2: pattern to be replaced
#arg3: filename pattern
echo replace $1 by $2 for all $3 files
for  i in `find . -type f -name "$3"`
do
sed  "s/$1/$2/g" $i
done

मैं इस स्क्रिप्ट का उपयोग करता हूं (जैसे, SUBS कहा जाता है):

./SUBS bbb ddd aa

जहां फ़ाइल आ है:

aaaa
bbbb
cccc

लेकिन, जब मुझे उम्मीद है कि bbbb को dddb के रूप में प्रतिस्थापित किया जाएगा,यह उसी सामग्री को दिखाता है यानी bbbb। किसी भी सुराग यहाँ क्या गलत है? इसके अलावा, मैं एक ही फाइल को बदलने के बाद संशोधित करना चाहता हूं। मैं उसे कैसे कर सकता हूँ? यह Qs के समान है बैश चर के साथ sed प्रतिस्थापन, लेकिन मेरे क्यूएस में, मैंने शेल चर के तर्क के रूप में खोजने और बदलने के लिए एक पैटर्न का उपयोग किया है।

उत्तर:

जवाब के लिए 3 № 1

वेरिएबल्स ने एकल उद्धरणों के अंदर डालने पर "विस्तार नहीं किया; आपको दोहरे उद्धरण चिह्नों का उपयोग करना होगा:

sed "s/$1/$2/g" "$i"

जगह में फ़ाइल को संशोधित करने के लिए:

sed -i.bak "s/$1/$2/g" "$i"

ऑपरेशन के बाद मूल फ़ाइल के साथ बैकअप दिया जाएगा .bak विस्तार; यदि आप बैकअप नहीं रखना चाहते हैं:

sed -i "s/$1/$2/g" "$i"