2012-06-21 14 views
21

मैं उदाहरण के लिए, एक एसईडी आदेश में एक चर का उपयोग नहीं कर पा रहे:एक एसईडी आदेश में एक चर का उपयोग करें

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 

मैं $ct_tname चाहते चर, सचमुच $ct_tname नहीं है, जो है मैं क्या मिलती रहती है ।

कोई भी जानता है कि यह काम करने के लिए कैसे प्राप्त करें?

समस्या वास्तव में अधिक जटिल है और मैंने कुछ जानकारी छोड़ी है।

ct_fname="%let outputfile="/user/ct_"$1".csv";" 

यहाँ, $1 तर्क मेरी bash स्क्रिप्ट के शुरू में में पारित (sed एक bash स्क्रिप्ट के अंदर चलाया जा रहा है) है।

यह सफलतापूर्वक चला नहीं है, लेकिन इसे चलाने पड़ता अगर मैं

ct_fname="%let table=ct_$1;" 

साथ ct_fname की जगह वहाँ एक रास्ता पहले ct_fname सफलतापूर्वक पारित होने के लिए प्राप्त करने के लिए है?

+0

संभव डुप्लिकेट [कैसे एसईडी के साथ एक पार्टी स्क्रिप्ट चर का उपयोग करने के लिए] (http://stackoverflow.com/questions/3204302/how-to-use-a-bash-script-variable-with-sed) –

+0

[sed scripting - पर्यावरण परिवर्तनीय प्रतिस्थापन] के संभावित डुप्लिकेट (http: // stackoverflow। कॉम/प्रश्न/5848 9 4/sed-scripting-environment-variable-substitution) – tripleee

उत्तर

34

आपको सिंगल कोट्स (') के बजाय डबल कोट्स (") का उपयोग करने की आवश्यकता है। सिंगल कोट्स वेरिएबल्स (विस्तार) के अनुवाद के बिना सचमुच अपनी सामग्री को पास करते हैं।

, आप ed बजाय का उपयोग करना चाहिए btw

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 

कोशिश, यदि आप एक फ़ाइल (यदि file2.sas अस्थायी फ़ाइल है) संपादन करने जा रहे हैं।

+0

यह SO पर इतनी बार आया है कि इसे फिर से उत्तर देने के लिए प्रतिबंधित किया जाना चाहिए: पी मुझे लगता है एसओ। किसी प्रश्न को पोस्ट करने से रोकना चाहिए, अगर उसे एक समान विषय मिल जाए, तो रोकें, लेकिन इसे पोस्ट करने से पहले चेतावनी दें कि एक जैसे सवाल का जवाब पहले से ही दिया गया है, और क्या उपयोगकर्ता अपने प्रश्न पोस्ट करने से पहले इसे पहले जांचते हैं। – c00kiemon5ter

+0

असल में, मेरी समस्या थोड़ा अधिक जटिल है और इसे 'से' बदलकर तय नहीं किया गया है, संपादित प्रश्न ऊपर है। मुझे लगता है कि जिस समस्या का सामना कर रहा हूं वह काफी चुनौतीपूर्ण है और इस बारे में सामान्य प्रश्न नहीं है। – user788171

1

आपको सिंगल (") उद्धरणों का उपयोग करने की आवश्यकता है, एकल (') उद्धरण के साथ चर के मूल्य को प्रतिस्थापित नहीं किया जाता है। चूंकि आप अपने प्रतिस्थापन पाठ में दोहरे उद्धरण चिह्नों है, तो आप उन्हें बचने के लिए की जरूरत है:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 
1

शैल चर एकल उद्धरण के अंदर का विस्तार नहीं कर रहे हैं। इसके बजाय इसे आजमाएं:

sed "24s/.*/\"$ct_tname\"/" file1.sas > file2.sas 
1

अन्य उत्तर उनके उदाहरणों में भागने वाले डबल कोट्स के उपयोग पर ध्यान केंद्रित करते हैं। ध्यान दें कि यह हमेशा नहीं है कि आप क्या चाहते:

$ FOO="auie"; echo foo123bar|sed "s/123/\"$FOO\"/" 
foo"auie"bar 
$ FOO="auie"; echo foo123bar|sed "s/123/$FOO/" 
fooauiebar 
$ FOO="auie"; echo fooauiebar|sed "s/\"$FOO\"/123/" 
fooauiebar 
$ FOO="auie"; echo fooauiebar|sed "s/$FOO/123/" 
foo123bar 
3

मेरे मामले में, मैं सिर्फ डबल लोगों द्वारा एकल उद्धरण remplaced:

for a in $(cat ext.cnf); do sed -n "/$a$/p" file1 >> file2; done 

अभी के लिए, यह अच्छी तरह से काम कर रहा है ...

0

समस्या यह है कि जब $ct_fname दिया जाता है, sed अतिरिक्त / विभाजक देखता है, इसलिए

sed "24s/.*/"$ct_tname"/" file1.sas > file2.sas 

sed "24s/.*/"%let outputfile=/user/ct_ARGUMENT1.csv;"/" file1.sas > file2.sas 

हो जाता है और वहाँ की उम्मीद 3 के बजाय 5 / हैं क्योंकि आप एक sed त्रुटि प्राप्त होगी।

इसके बजाय, | या :, और या तो एकल या डबल उद्धरण ठीक काम करेंगे की तरह एक अप्रयुक्त चरित्र के लिए अपनी sed विभाजक बदलें:

sed '24s|.*|'$ct_tname'|' file1.sas > file2.sas 
sed "24s|.*|"$ct_tname"|" file1.sas > file2.sas 
की
संबंधित मुद्दे