सवाल मैं sed आदेश में चर का उपयोग कैसे करूं?


मैंने प्रतिस्थापित करने के लिए निम्नलिखित कोड की कोशिश की QQ साथ में ZZ, लेकिन यह वही नहीं करता जो मैं चाहता हूं:

var1=QQ
sed -i 's/$var1/ZZ/g' $file

हालांकि, यह कोड वह करता है जो मैं चाहता हूं:

sed -i 's/QQ/ZZ/g' $file

मैं चर का उपयोग कैसे करूं? sed?


179
2017-11-07 16:30


मूल


देख तुम्हारा जवाब इस पोस्ट में है - ata
सम्बंधित: stackoverflow.com/questions/407523/... - Ciro Santilli 新疆改造中心 六四事件 法轮功


जवाब:


खोल चर का विस्तार करने के लिए जिम्मेदार है। जब आप तारों के लिए सिंगल कोट्स का उपयोग करते हैं, तो इसकी सामग्री का शाब्दिक व्यवहार किया जाएगा, इसलिए sed अब शाब्दिक की हर घटना को प्रतिस्थापित करने की कोशिश करता है $var1 द्वारा ZZ

डबल कोट्स का उपयोग करना

व्हाइटस्पेस को संरक्षित करते समय खोल विस्तार चर बनाने के लिए डबल कोट्स का उपयोग करें:

sed -i "s/$var1/ZZ/g" "$file"

जब आपको प्रतिस्थापन स्ट्रिंग में उद्धरण चरित्र की आवश्यकता होती है, तो आपको इसे बैकस्लैश से पहले करना होगा जिसे शैल द्वारा व्याख्या किया जाएगा। निम्नलिखित उदाहरण में, स्ट्रिंग quote me द्वारा प्रतिस्थापित किया जाएगा "quote me" (चरित्र & द्वारा व्याख्या की गई है sed):

sed -i "s/quote me/\"&\"/" "$file"

एकल उद्धरण का उपयोग करना

यदि आपके पास बहुत सारे शैल मेटा-वर्ण हैं, तो पैटर्न के लिए सिंगल कोट्स और चर के लिए डबल कोट्स का उपयोग करने पर विचार करें:

sed -i 's,'"$pattern"',Say hurrah to &: \0/,' "$file"

ध्यान दें कि मैं कैसे उपयोग करता हूं s,pattern,replacement, के बजाय s/pattern/replacement/, मैंने इसे हस्तक्षेप से बचने के लिए किया था / में \0/

उदाहरण

खोल तब उपरोक्त आदेश चलाता है sed अगले तर्क के साथ (मानते हैं pattern=bert तथा file=text.txt):

-i
s,bert,Say hurrah to &: \0/,
text.txt

अगर file.txt शामिल bert, आउटपुट होगा:

Say hurrah to bert: \0/

253
2017-11-07 17:20



इस अल्पविराम से अलग फॉर्म का उपयोग करके "/ g" विकल्प कैसे पास होगा? - blong
@ बी। लोंग यह एक है g विकल्प, तो आप पास करेंगे s,foo,bar,g बजाय। - Lekensteyn
आपका एकल उद्धरण उदाहरण अलग-अलग उपयोगी है, रेगेक्स पैटर्न का उपयोग करके बहुत अच्छी तरह से कवर करता है! - Brian Thomas
यदि आप उपयोग करने के लिए लुभाने में हैं \\0 के बजाय \0, यह तब नहीं किया जाना चाहिए जब \0 एकल उद्धरण में संलग्न है। अन्यथा sed एक शाब्दिक के लिए पैटर्न बदल जाएगा \0 पूरे मैच के बजाय। - Lekensteyn


हम चर का उपयोग कर सकते हैं sed डबल कोट्स का उपयोग करना:

sed -i "s/$var/r_str/g" file_name

यदि आपके पास स्लैश है / चर में तो अलग विभाजक का उपयोग करें, जैसे नीचे:

sed -i "s|$var|r_str|g" file_name

79
2017-08-07 15:29