2011-09-26 7 views
5

के बाद मुझे अपने प्रतिस्थापन टेक्स्ट में बैकरेफर के साथ परेशानी हो रही है जिसके बाद एक शाब्दिक है। मैं निम्नलिखित की कोशिश की है:प्रतिलिपि में, प्रतिस्थापन पाठ में बैकरेफर, संख्यात्मक शाब्दिक

perl -0pi -e "s/(<tag1>foo<\/tag1>\n\s*<tag2>)[^\n]*(<\/tag2>)/\1${varWithLeadingNumber}\2/" file.xml 
perl -0pi -e "s/(<tag1>foo<\/tag1>\n\s*<tag2>)[^\n]*(<\/tag2>)/\g{1}${varWithLeadingNumber}\g{2}/" file.xml 

निश्चित रूप से पहले समस्याओं का कारण बनता है क्योंकि $ {varWithLeadingNumber} एक संख्या के साथ शुरू होता है, लेकिन मैं अपने दूसरे प्रयास में \g{1} निर्माण सोचा ऊपर इस समस्या को हल करने वाला था। मैं perl 5.12.4 का उपयोग कर रहा हूँ।

+4

क्या आप वाकई अपनी समस्या खोल के साथ नहीं हैं? मैं स्क्रिप्ट चर एकत्रित करने के हिस्से को छोड़कर, एकल उद्धरणों में स्क्रिप्ट को संलग्न करता हूं, बस चिंता करने के लिए बैकस्लाश की संख्या को कम करने के लिए। –

+0

मैंने अभी कोशिश की, उदाहरण के लिए, 'perl -0pi -e'/( foo <\/tag1> \ n \ s * ) [^ \ n] * (<\/tag2>)/\ g {1} 25 \ g {2}/'file.xml', और परिणाम वही था। प्रतिस्थापन पाठ 'जी {1} 25 जी {2} 'होने के समाप्त होता है। – jonderry

उत्तर

18

प्रतिस्थापन अभिव्यक्ति में \1, \2 आदि का उपयोग करना गलत है। \1 एक नियमित अभिव्यक्ति पैटर्न है जिसका अर्थ है "मिलान करने वाला पहला कैप्चर मिलान करें" जो प्रतिस्थापन अभिव्यक्ति में कोई समझ नहीं आता है। नियमित अभिव्यक्ति पैटर्न नियमित अभिव्यक्तियों के बाहर उपयोग नहीं किया जाना चाहिए! $1, $2, आदि यह है कि आपको वहां क्या उपयोग करना चाहिए।

\1 फिक्सिंग के बाद, आप

perl ... -e'... s/.../...$1$varWithLeadingNumber.../ ...' 

कहा, मुझे लगता है varWithLeadingNumber एक खोल चर माना जाता है है? यदि यह एक पर्ल वैरिएबल है तो आपको कोई समस्या नहीं होनी चाहिए। आप खोल अंतर्वेशन varWithLeadingNumber हो रही है, समस्या का उपयोग कर

perl ... -e"... s/.../...\${1}${varWithLeadingNumber}.../ ..." 

ध्यान दें कि आप समस्याओं का होगा यदि $ varWithLeadingNumber "$" होता है, तय किया जा सकता है "@", "\" या "/", इसलिए आप इंटरपोलेशन के बजाय कमांड लाइन तर्क का उपयोग करना चाह सकते हैं।

perl ... -pe' 
    BEGIN { $val = shift; } 
    ... s/.../...$1$val.../ ... 
' "${varWithLeadingNumber}" 

आप पर्यावरण चर का भी उपयोग कर सकते हैं।

export varWithLeadingNumber 
perl ... -pe's/.../...$1$ENV{varWithLeadingNumber}.../' 

या

varWithLeadingNumber=varWithLeadingNumber \ 
    perl ... -pe's/.../...$1$ENV{varWithLeadingNumber}.../' 

आप एक \1

s/...\1.../.../ 

आप सहित समस्या को कई तरीकों से बचने कर सकते हैं किया तो

s/...(?:\1).../.../ 
+0

यह काम करता है अगर मैं 'perl -0pi -e '/ ( foo <\/tag1> \ n \ s * ) [^ \ n] * (<\/tag2>)/$ {1}' $ {varWithLeadingNumber} '$ {2}/'file.xml। धन्यवाद। – jonderry

+0

केवल '$ varWithLeadingNumber' के सीमित मानों के लिए। मैं इसके खिलाफ सिफारिश करता हूं। – ikegami

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