2012-05-03 12 views
13

मैं खोज और बदलने के लिए कई नियमित अभिव्यक्ति पर्ल का उपयोग कर रहा के साथ बदलें:पर्ल कमांड लाइन खोज और कई भाव

prompt> find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g' -pe 's/(\W)##/\1/g' 
syntax error at -e line 2, near "s/(\W)##/\1/g" 
Execution of -e aborted due to compilation errors. 
xargs: perl: exited with status 255; aborting 

होने एकाधिक -e में मान्य है: जब मैं निम्न आदेश निष्पादित, मैं कोई त्रुटि मिलती है पर्ल, तो यह क्यों काम नहीं कर रहा है? क्या इसका कोई उपाय है?

+0

आप उन दो regexes को एक विकल्प के साथ प्रतिस्थापित कर सकते हैं: 's/## (? = \ W) | (? <= \ W) ## // g' – TLP

+0

@TLP मैं पर्ल के लिए नोब हूं; कृपया आप समझा सकते हैं कि? = और? <= क्या यह संदर्भ है? –

+0

वे चारों ओर घूमने वाले दावे हैं, आप उनके बारे में अधिक जानकारी [perldoc perlre] में देख सकते हैं (http://perldoc.perl.org/perlre.html#Look-Around-Assertions)। वे शून्य-चौड़ाई हैं, इसलिए वे केवल जांचते हैं, और हटाते नहीं हैं। – TLP

उत्तर

29

कई -e की अनुमति है।

आप ';'

find "*.cpp" | xargs perl -i -pe 's/##(\W)/\1/g;' -pe 's/(\W)##/\1/g;' 

पर्ल बयान याद कर रहे हैं ; साथ समाप्त करने के लिए है। ब्लॉक में अंतिम विवरण को समाप्त करने वाले अर्धविराम की आवश्यकता नहीं है। तो ; के बिना एक एकल -e काम करेगा, लेकिन आपको ; जोड़ना होगा जब आपके पास एकाधिक -e कथन होंगे।

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। मैं इस बात को समझने की कोशिश कर रहा था। –

+5

या 'xargs perl -i -pe '/ ## (\ W)/\ 1/g; एस/(\ डब्ल्यू) ##/\ 1/जी, ' ' –

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