2013-06-21 10 views
5

मैं एक PHP फ़ाइल को पार्स कर रहा हूं और एचटीएमएल में फ़ंक्शन प्रोटोटाइप तत्व लपेट रहा हूं। यदि वहां एम्पर्सेंड हैं, तो यह मेरे कोड को तोड़ देता है।सेड और एस्क एस्केपिंग एम्परसैंड्स (&)

इनपुट: function foo (&$var1, &$var2){...} // स्ट्रिंग के रूप में
वांछित उत्पादन (HTML में): &$var1, &$var2// मूल रूप से, बस आउटपुट चर इतना है कि वे ब्राउज़र में उचित ढंग से प्रदर्शित होते हैं

अभी , मैं प्रत्येक चर को awk की उप विधि , और फिर sed में भेज रहा हूं।

sub(/^&/, "\\\&", param) #param is the variable of interest (e.g. &$var1) 

#Intermediate step in case it's relevant. The awk-processed elements 
#are sent to ${file}_param.txt. Each set of parameters are delimited by colons. 
param=$(cut -d: -f$counter ${file}_param.txt) 

#Replace some default text in template file with real stuff. 
sed -i "s|@PARAM|$param|1" "$base"_funct_def.txt 

आउटपुट मैं हो रही है: ऐम्परसेंड व्याख्या की जा रही है। पूरा मैच बदल दिया गया है।

समस्या का अलगाव: इसके बजाय ब्राउज़र में 'g $ var1' प्रदर्शित करता है, जैसा कि मैं चाहता हूं। हालांकि, मैं इसके बजाय '&' प्राप्त करने का प्रयास कर रहा हूं।

sub(/^&/, "g", param) 

मेरे प्रयास: मैं क्योंकि मैंने सोचा awk पहले '\ &' जो, SED में खिलाया, व्याख्या '\ &' शाब्दिक '&' के रूप में में इसे संसाधित होगा तीन बैकस्लैश का इस्तेमाल किया। हालांकि, मैंने 1 से 6 बैकस्लेश से कहीं भी कोशिश की है, इसका कोई फायदा नहीं हुआ है।

प्रश्न: मैं से कैसे बच सकता हूं?

मैनुअल: http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html


कुछ "मेटा"/डिजाइन मैं क्या
मैं का समूह है ऐसा करने के लिए (प्रश्न के लिए आवश्यक नहीं !!) कोशिश कर रहा हूँ के बारे में सवाल PHP फाइलें जिन्हें मैं कुछ दस्तावेज उत्पन्न करने की कोशिश कर रहा हूं (जेवाडॉक्स की तरह संरचित)। मैं REGEX और शैल स्क्रिप्ट का उपयोग करके इसे पार कर रहा हूं और इसे पार्स कर रहा हूं, ताकि मैं फ़ंक्शन नाम, पैरामीटर और वापसी आइटम सूचीबद्ध कर सकूं। अब तक, REGEX ने मुझे बहुत अच्छी तरह से काम किया है, लेकिन मैंने इस बारे में बहुत कुछ पढ़ा है कि यह ऐसा कुछ है जिसके लिए REGEX का उपयोग नहीं किया जाना चाहिए। मैं इनमें से किसी के बारे में किसी भी टिप्पणी का स्वागत करता हूं (आमतौर पर प्रलेखन कैसे उत्पन्न होता है?)। धन्यवाद दोस्तों!

+0

क्या करता है '$ param' वास्तव में क्या है? यदि आदेश अनुक्रमिक रूप से नहीं चलते हैं (उदाहरण के लिए यदि वास्तव में कुछ अन्य कोड हैं), तो आपको उन्हें एक ही कोड ब्लॉक में नहीं रखना चाहिए, यह भ्रामक है। – doubleDown

+0

भ्रामक हिस्सा के बारे में खेद है। मैं इसे भविष्य में ध्यान में रखूंगा। $ param में पैरामीटर तत्व होता है। उदाहरण के लिए, यदि कोई फ़ंक्शन है: 'फ़ंक्शन foo (& $ arg1, $ arg2) ' $ param' 'और $ arg1' अच्छी खबर हालांकि: मुझे एक फिक्स मिला। Seding करने से पहले, मैं किसी भी 'और' से बचने के लिए सुनिश्चित किया। मैंने पहले पैरा असाइनमेंट के बाद निम्न अधिकार जोड़ा: 'param = $ (echo $ param | sed's |^& | \\ & g g)) यह अजीब चीजों को लपेटने की कोशिश करने के विरोध में है कोड का हिस्सा – bobbyjoe93

उत्तर

0

मेरा मानना ​​है कि एचटीएमएल & एम्पर्सेंड चरित्र के रूप में पढ़ता है। अपने awk स्क्रिप्ट में आप इस्तेमाल कर सकते हैं:

sub(/^&/, "&", param) 

param में डॉलर साइन बैकस्लैश, उदा के साथ भाग जाने की आवश्यकता है & $ var को & \ $ var के रूप में लिखा जाना चाहिए, या sed और awk एक चर के रूप में $ var का विस्तार करने का प्रयास करेगा।

+1

दुर्भाग्यवश, मुझे नहीं लगता कि यह मुद्दा है। इसे "एंड amp" के साथ बदलना अभी भी अजीब और sed द्वारा REGEX '&' के रूप में व्याख्या किया जाएगा, जो आउटपुट में मिलान किए गए आइटम को डुप्लिकेट करता है। (मैंने कोशिश की कि आपने एक सैनिटी चेक के रूप में क्या सुझाव दिया था। काम नहीं किया।) – bobbyjoe93

+0

मैंने कुछ परीक्षण करने के बाद अपना जवाब बदल दिया। अप्रतिबंधित डॉलर के संकेत इस मुद्दे का कारण बन रहे हैं। – gbrener

0

दो बैकस्लाश का उपयोग (यानी sub(/^&/, "\\&", param)) मेरे लिए काम करता है। क्या यह आपके लिए काम नहीं करता है?

यह प्रलेखित है the nawk manual में आप अपने प्रश्न में निर्दिष्ट:

हमेशा की तरह, स्ट्रिंग में एक बैकस्लैश सम्मिलित करने के लिए, आप दो बैकस्लैश लिखना चाहिए। इसलिए, 'एक स्ट्रिंग निरंतर में एक शाब्दिक `& शामिल करने के लिए' लिखने` \\ & को एम्परसैंड द्वारा प्रतिस्थापन

इसके अलावा में, अपने sub() समारोह अनिवार्य रूप से बदल रहा है एक ampersand। तो शायद यही कारण है कि आपको लगता है कि यह दो बैकस्लेश के साथ भी काम नहीं कर रहा है।

+0

क्या यह उप से sed के आउटपुट भेजने के बाद काम करता था? मुझे लगता है कि सब एक शाब्दिक 'और' आउटपुट कर रहा है, लेकिन जब इसे sed पास किया जाता है, तो '&' का अर्थ एक बार फिर से किया जाता है। तो सब के लिए, मैं वास्तव में '\ &' आउटपुट करने की कोशिश कर रहा हूं, ताकि वह sed हिस्से में भाग जाए। – bobbyjoe93

0

sed विधि:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' 

आउटपुट:

&$var1, &$var2 

या यदि एचटीएमएल कोड की जरूरत है, txt2html की तरह एक util है कि पारित:

printf "%s\n" 'function foo (&$var1, &$var2){...}//as String' | 
sed -n '/function/{s/^.*(//;s/).*$//;p}' | txt2html 
संबंधित मुद्दे