2010-07-22 13 views
61

का उपयोग कर खोल स्क्रिप्ट में एक स्ट्रिंग को बदलें, मैं एक शेल स्क्रिप्ट के अंदर एक स्ट्रिंग को बदलने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं।एक वैरिएबल

echo $LINE | sed -e 's/12345678/"$replace"/g' 

लेकिन यह है कि चर के मूल्य के बजाय $replace के साथ बदल रही है।

क्या कोई बता सकता है कि क्या गलत हुआ?

+0

उन में स्लैश के साथ मूल्यों से निपटने के बारे में आम संबंधित प्रश्न के लिए, http://stackoverflow.com/questions/5864146/use-slashes-in-sed-replace – tripleee

उत्तर

87

यदि आप $replace की व्याख्या करना चाहते हैं, तो आपको एकल प्रतिस्थापन का उपयोग नहीं करना चाहिए क्योंकि वे परिवर्तनीय प्रतिस्थापन को रोकते हैं।

प्रयास करें:।

echo $LINE | sed -e "s/12345678/\"${replace}\"/g" 

मानते हुए कि आपके उद्धरण में डाल चाहते हैं आप नहीं चाहते उद्धरण करना हैं, तो उपयोग:

echo $LINE | sed -e "s/12345678/${replace}/g" 

ट्रांसक्रिप्ट:

pax> export replace=987654321 
pax> echo X123456789X | sed "s/123456789/${replace}/" 
X987654321X 
pax> _ 

बस यह सुनिश्चित करने के लिए सावधान रहें कि ${replace} में कोई charac नहीं है उदाहरण के लिए sed (जैसे /) के महत्व के टियर) क्योंकि इससे बचने तक भ्रम पैदा हो जाएगा। लेकिन अगर, जैसा कि आप कहते हैं, तो आप एक नंबर को दूसरे के साथ बदल रहे हैं, यह कोई समस्या नहीं होनी चाहिए।

+0

देख मुझे नहीं चाहते उद्धरण अंदर डाल चाहते हैं एक संख्या होने के लिए अन्य – Vijay

+2

'निर्यात' के साथ प्रतिस्थापित नहीं किया गया है। –

+1

पक्सडीब्लो: 'सेट' भी जरूरी नहीं है (और आप इसका उपयोग कैसे करेंगे?)। बस 'बदलें = 987654321'। –

3
echo $LINE | sed -e 's/12345678/'$replace'/g' 

आप अभी भी एकल उद्धरण का उपयोग कर सकते, लेकिन आप उन्हें "खुला" जब आप चर सही जगह पर विस्तार चाहते हैं। अन्यथा स्ट्रिंग को "शाब्दिक रूप से" लिया जाता है (जैसा कि @paxdiablo सही ढंग से कहा गया है, उसका उत्तर भी सही है)

+0

यह समस्या है कि का उपयोग कर 'किसी भी उद्धरण के बाहर $ replace' खोल मूल्य पर खाली स्थान के tokenization और वाइल्डकार्ड विस्तार प्रदर्शन करने के लिए कारण होगा है। यह सरल मूल्यों के साथ काम करने के लिए प्रतीत होता है, लेकिन नाटकीय तारों पर नाटकीय रूप से उड़ सकता है। उत्पादन कोड में इसका इस्तेमाल न करें। – tripleee

52

आप खोल (bash/ksh) का उपयोग कर सकते हैं।

$ var="12345678abc" 
$ replace="test" 
$ echo ${var//12345678/$replace} 
testabc 
+3

मई का बैश-विशिष्ट (और ksh?) का उल्लेख करना चाहते हैं। शायद नहीं ज्यादातर लोगों लेकिन हम में से कुछ करने के लिए आयात की अभी भी, प्राचीन UNIXen पर काम करने :-) – paxdiablo

+4

खबरदार मजबूर हैं यह भी पानी का छींटा पर विफल रहता है, जो '/ bin/कई आधुनिक Linuxes पर sh' है। – phihag

5

एकल उद्धरण बहुत मजबूत हैं। एक बार अंदर, जब तक आप छोड़ते हैं, वे परिवर्तनीय प्रतिस्थापन का आह्वान करने के लिए कुछ भी नहीं कर सकते हैं। दोहरे उद्धरण चिह्नों का उपयोग करें के बजाय:

echo $LINE | sed -e "s/12345678/$replace/g" 
-1

मैं दोहरे उद्धरण चिह्नों का उपयोग करने, के रूप में एकल quptes बहुत शक्तिशाली रूप में हम उन्हें इस्तेमाल किया है, तो इसके अंदर कुछ भी बदलने में सक्षम न या चर substituion आह्वान कर सकते हैं कर रहे हैं पसंद करते हैं।

इसलिए दोहरे उद्धरणों का उपयोग करें।

echo $LINE | sed -e "s/12345678/$replace/g" 
+4

क्या यह डेव के [उत्तर] से भिन्न है (http://stackoverflow.com/a/6756853/2235132)? – devnull

1

अपने खोल चर का विस्तार करने दें, आप की तरह

sed -i "s#12345678#$replace#g" file.txt 

यह डबल उद्धरण चिह्नों का उपयोग करने के लिए टूट जाएगा अगर $replace विशेष sed वर्ण (#, \) होते हैं की जरूरत है।लेकिन तुम preprocess $replace उन्हें उद्धृत करने के लिए कर सकते हैं:

replace_quoted=$(printf '%s' "$replace" | sed 's/[#\]/\\\0/g') 
sed -i "s#12345678#$replace_quoted#g" file.txt 
7

प्रश्न के लिए विशिष्ट नहीं है, लेकिन लोगों को जो एक ही कार्यक्षमता के पिछले जवाब से स्पष्टता के लिए विस्तार किया तरह की जरूरत के लिए: यह बजाय

str="someFileName.foo" 
find=".foo" 
replace=".bar" 
result=${str//$find/$replace} 
echo $result  
# result is: someFileName.bar 

str="someFileName.sally" 
find=".foo" 
replace=".bar" 
result=${str//$find/$replace} 
echo $result  
# result is: someFileName.sally because ".foo" was not found 
0

उपयोग

echo $LINE | sed -e 's/12345678/$replace/g' 
इस

मेरे लिए काम करता बस उद्धरण हटाने

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