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


266

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

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

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

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

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



जवाबों:


358

शेल चरों के विस्तार के लिए जिम्मेदार है। जब आप स्ट्रिंग्स के लिए एकल उद्धरण का उपयोग करते हैं, तो इसकी सामग्री का शाब्दिक रूप से इलाज किया जाएगा, इसलिए 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/

2
इस अल्पविराम से अलग किए गए फ़ॉर्म का उपयोग करके कोई "/ g" विकल्प कैसे पारित करेगा?
ब्‍लॉन्‍ग

6
@ b.long यह एक gविकल्प है, इसलिए आप s,foo,bar,gइसके बजाय पास होंगे ।
१२:३२ पर लेकेनस्टाइन

1
अपने एकल उद्धरण उदाहरण isparticularly उपयोगी है, बहुत अच्छी तरह से regex पैटर्न का उपयोग कर sed को शामिल किया गया!
ब्रायन थॉमस

यदि आप इसके \\0बजाय उपयोग करने के लिए लुभाए जाते हैं \0, तो यह तब नहीं किया जाना चाहिए जब \0एकल उद्धरणों में संलग्न हो। अन्यथा पूरे मैच के बजाय sedएक शाब्दिक के लिए पैटर्न का विकल्प देगा \0
लेकेन्स्टाइन

मेरे लिए छल किया।
जिम्ह

114

हम sedदोहरे उद्धरण चिह्नों का उपयोग कर चर का उपयोग कर सकते हैं :

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

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

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

7
यदि आपके पास /चर में स्लैश है => इससे मुझे बचा लिया गया है! मेरा चर एक url है और इसमें सम्‍मिलित है /|विभाजक के रूप में उपयोग करने के लिए मेरे मुद्दे को तय किया
sonlexqt

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