2010-06-29 10 views
16

मैं अपने Makefile में निम्नलिखित डाल की कोशिश की है:एक Makefile में sed का उपयोग कैसे

@if [ $(DEMO) -eq 0 ]; then \ 
    cat sys.conf | sed -e "s#^public_demo[\s=].*$#public_demo=0#" >sys.conf.temp; \ 
else \ 
    cat sys.conf | sed -e "s#^public_demo[\s=].*$#public_demo=1#" >sys.conf.temp; \ 
fi 

लेकिन जब मैं चलाने बनाने के लिए, मैं निम्नलिखित त्रुटि मिलती है:

sed: -e expression #1, char 30: unterminated `s' command 

मैं तो कंसोल में sed वाली सटीक रेखाएं चलाएं, वे सही तरीके से व्यवहार करते हैं।

मुझे यह त्रुटि क्यों मिल रही है और समस्या को कैसे ठीक किया जा सकता है?

+0

वहाँ बिंदु का एक बहुत पाइप इनपुट करने के लिए बिल्ली का उपयोग करने में नहीं है ... तुम बस का उपयोग नहीं कर सकता है stdin: यह

chmod +x replacer.sh 

के साथ निष्पादन योग्य बिट दें अब आप अपने Makefile में इस फ़ाइल को कॉल कर सकते हैं sed आदेश में पुनर्निर्देशन? –

+0

@Platinum Azure: हाँ, शायद। यादृच्छिक सुधारों की कोशिश करते समय यह एक संस्करण है जो मैं पहुंचा। – Tom

उत्तर

21

यह एक प्रतिस्थापन के रूप में व्याख्या किए गए प्रतिस्थापन में $ संकेत हो सकता है। उनमें से दो का उपयोग करने की कोशिश करें । * $$ # public_demo। फिर इसे एक ही डॉलर में विस्तारित करेंगे।

संपादित करें: यह केवल आधा जवाब था। क्रिस्टिस ने उत्तर दिया: दूसरा हिस्सा यह है कि किसी को भी $ संकेत का विस्तार करने से रोकने के लिए सिंगल कोट्स का उपयोग करने की आवश्यकता है।

6

मैं तुम्हें दोहरे उद्धरण चिह्नों के बजाय एकल उद्धरण का उपयोग करने का सुझाव, $ एक विशेष चार के रूप में मेकअप से sed चलाने से पहले संसाधित किया जा सकता है:

cat sys.conf | sed -e 's#^public_demo[\s=].*$#public_demo=0#' >sys.conf.temp; 
+0

मैंने पहले स्थान पर सिंगल कोट्स का इस्तेमाल किया और डबल कोट्स पर स्विच किया क्योंकि मैंने भी सोचा है कि सिंगल कोट्स समस्या थी। – Tom

+0

दरअसल, मुझे लगता है कि क्रिस्टिस सही है, भले ही मेरा जवाब सही है या नहीं। $ दो बार विस्तारित किया जाएगा, मुझे लगता है: एक बार मेकफ़ाइल में, मेरे उत्तर के अनुसार, और एक बार बाश से। सिंगल कोट्स का उपयोग करने से बाश को $ विस्तार करने से रोक दिया जाएगा, लेकिन नहीं बनाया जाएगा। –

+0

असल में आप दोनों सही थे। एकल उद्धरण और $$ का उपयोग समस्या को हल किया। अब मैं किसका जवाब स्वीकार करता हूं? – Tom

0

उपयोग # की तुलना में और भागों को अलग करने के लिए कुछ।

+0

मैंने पहली जगह में इस्तेमाल किया और # पर स्विच किया क्योंकि मैंने भी सोचा है कि विभाजक समस्या थी। – Tom

3

मेरी मशीन में make संस्करण है:

$ make --version 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for x86_64-redhat-linux-gnu 

और sed संस्करण:

:

$ sed --version 
GNU sed version 4.2.1 

मैं $ के लिए बैकस्लैश जोड़ना होगा करने के लिए रोकने sed पंक्ति के अंत के रूप में यह लेने

cat sys.conf | sed -e 's#^public_demo[\s=].*\$$#public_demo=0#' >sys.conf.temp 
0

एक समस्या जिसमें मैंने sed का उपयोग किया था एक मेकफ़ाइल वर्तमान उत्तरों से संबोधित नहीं है, इसलिए मैं इसे यहां समझाऊंगा। मैं बैश वैरिएबल जैसे पॉप्युलेट कर रहा था: remote_owner=$$($(MAKE) remote.owner) और फिर मेरे sed substitution में उन चर का उपयोग कर रहा था। समस्या, कारण जटिल तरीका अपना नियम सेट कर रहे हैं, remote_owner मेकअप के उस में खुद उत्पादन हो सकता है, है मुझे त्रुटि दे रही है:,

sed: -e expression #1, char 69: unknown option to `s' 
make: *** [alter_table_local.sql] Error 1 
उदाहरण के लिए

डिबगिंग संदेशों जोड़कर, मैं local_owner करने के लिए सेट पाया:

make[1]: Entering directory `/home/jcomeau/rentacoder/jh' 
jcomeau 

जवाब बनाने के लिए --silent विकल्प जोड़ने के लिए किया गया था: remote_owner=$$($(MAKE) --silent remote.owner)

0

मैंने कोशिश की डबल $$ संकेत लेकिन यह मेरी समस्या में काम नहीं किया है, शायद $$$$ या $$$$$$$$ काम किया होगा, क्योंकि मेरी मेकफ़ाइल अन्य मेकफ़ाइल कॉल करता है और इसी तरह। लेकिन मुझे एक बेहतर समाधान मिला:

एक शेल फ़ाइल replacer.sh बनाएं जो आपके मेकफ़ाइल के समान फ़ोल्डर में sed कमांड निष्पादित करता है।

./replacer.sh 
संबंधित मुद्दे