2012-08-29 14 views
29

यह मैं (सरलीकृत उदाहरण) क्या कर रहा है:जीएनयू sed में मेरे लुकहेड रेगेक्स के साथ क्या गलत है?

gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt 

मैं हर पंक्ति कि foo साथ शुरू नहीं करता है के सामने bar डाल करने के लिए कोशिश कर रहा हूँ। यह त्रुटि है:

gsed: -e expression #1, char 22: Invalid preceding regular expression 

क्या गलत है?

+0

http://stackoverflow.com/questions/2086450/pcre-regex-to-sed-regex का संभावित डुप्लिकेट – hostmaster

+1

यदि संभव हो तो चुने गए उत्तर को अपडेट करें। [यह] (http://stackoverflow.com/a/12178023/131120) दिखाता है कि यह वास्तव में sed के साथ प्राप्त करना संभव है। – erikbwork

उत्तर

36

जहाँ तक मुझे पता है कि sed न तो आगे बढ़ रहा है और न ही पीछे दिख रहा है। perl जैसे समान वाक्यविन्यास वाले अधिक शक्तिशाली भाषा पर स्विच करें।

+14

संदर्भ के लिए 'perl' रूपांतरण के लिए एक सरल' sed' रूपांतरण: 'sed' s/before/after/g '/ my/file' => 'cat/my/file | perl -ne/पहले/बाद/जी; प्रिंट; '' – Batandwa

+4

@ बट्टान्वा http://www.smallo.ruhr.de/award.html – ceving

+7

@ बट्टंदवा पर्ल में बिल्ली और पाइपिंग का उपयोग अनावश्यक है। बस 'perl -pi -e'/पहले/बाद/g '/ my/file' का उपयोग करें। – ypid

6

आप पीएलएल संगत नियमित अभिव्यक्ति (पीसीआरई) वाक्यविन्यास का उपयोग करते हैं जो जीएनयू sed द्वारा समर्थित नहीं है। आपको SED Regular-Expressions के अनुसार अपने regex को फिर से लिखना चाहिए या इसके बजाय perl का उपयोग करना चाहिए।

83
sed -i '/^foo/! s/^/bar/' file.txt 
  • -i => बदलाव हो फ़ाइल
  • /^foo/! => केवल बार लाइन के शुरू होने से foo (^foo)
  • s/^/bar/ => परिवर्तन के साथ शुरू लाइनें नहीं (!) पर अगले क्रिया को निष्पादित  
+3

बहुत अच्छा समाधान। बैक ट्रैकिंग के लिए कोई ज़रूरत नहीं है। बस पहले से मौजूद कार्यक्षमता का उपयोग करें। –

+7

यह '^ foo' जैसी लंगर अभिव्यक्ति के लिए ठीक है, लेकिन दुर्भाग्य से पैटर्न में कहीं भी नकारात्मक लुकहेड के सामान्य मामले तक विस्तार नहीं होता है। – tripleee

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