2011-08-11 13 views
6

मैं एक बैश स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो कुछ चर लेता है और फिर स्ट्रिंग वाले फ़ाइलों की सूची प्राप्त करने के लिए grep का उपयोग करके किसी दिए गए फ़ाइल खोज के साथ ढूंढ/प्रतिस्थापित करता है। मुझे लगता है कि मेरे पास जो मुद्दा है, वह है कि चर में चर दिखाई दे रहे हैं, मुझे यकीन नहीं है कि यह और क्या हो सकता है।लूप स्क्रिप्ट एक लूप में चर के साथ sed का उपयोग कर?

if [ "$searchFiles" != "" -a "$oldString" != "" -a "$newString" != "" ]; then 
    echo -en "Searching for '$searchFiles' and replacing '$oldString' with '$newString'.\n" 
    for i in `grep $oldString $searchFiles |cut -d: -f1|uniq`; do 
     sed -i 's/${oldString}/${newString}/g' $i; 
    done 
    echo -en "Done.\n" 
else 
    usage 
fi 
+0

आप की जरूरत है डबल कोट्स मुझे लगता है कि - 'sed मैं" s/$ {oldString}/$ {newString}/g "$ i;' – arunkumar

उत्तर

15

डबल कोट्स का उपयोग करें ताकि खोल चर बदल सके।

for i in `grep -l $oldString $searchFiles`; do 
    sed -i "s/${oldString}/${newString}/g" $i; 
done 

अपनी खोज या स्ट्रिंग की जगह विशेष वर्ण आप उन्हें बचने के लिए की जरूरत है या नहीं: बैश में चर प्रतिस्थापन के लिए Escape a string for a sed replace pattern

+0

धन्यवाद, यह किया और स्ट्रिंग से बचने में मदद करने के लिए किसी स्थान को इंगित करने के लिए धन्यवाद। यह काम करने के लिए मेरी अगली बात थी। – LF4

4

उपयोग करती हैं इसलिए पर्यावरण चर दोहरे उद्धरण चिह्नों खोल द्वारा विस्तारित किया जाता है इससे पहले कि यह एसईडी कॉल:

sed -i "s/${oldString}/${newString}/g" $i; 

सावधान रहें: यदि दोनों में से oldString या newString स्लैश या अन्य regexp विशेष वर्ण, वे हो जाएगा उनके विशेष अर्थ के रूप में व्याख्या की गई, शाब्दिक तारों के रूप में नहीं।

संबंधित मुद्दे