2012-10-29 16 views
7

मैंने आईपी पते के तीसरे हिस्से को प्रतिस्थापित करने के लिए निम्नलिखित sed one liner लिखा था।विस्तारित regexp और कैप्चर समूहों का उपयोग करके Sed

sed 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g' 

192.168.0.1 
192.168.15.1 

मैं ?? जो regexp बढ़ा दिया गया है का उपयोग करके इसे आलसी तो यह 192.168.15 साथ 192.168.0 जगह लेंगे बनाना चाहते लेकिन जब मैं '-r' विकल्प की आपूर्ति मैं निम्नलिखित त्रुटि मिलती है।

$ sed -r 's/192\.168\.[0-9]*\.\([0-9]*\)/192.168.15.\1/g' 
sed: -e expression #1, char 44: invalid reference \1 on `s' command's RHS 

आप व्याख्या कर सकते हैं यहाँ क्या चल रहा है और कैसे एक अभिव्यक्ति कैप्चर समूहों के उपयोग जबकि आलसी बनाने के लिए किया जाता है?

नोट: मैं कई अलग-अलग दृष्टिकोणों का उपयोग करके उदाहरण प्राप्त कर सकता हूं, मेरा प्रश्न उदाहरण को हल करने का तरीका नहीं है। मैं extened regexp और कब्जे समूहों के साथ sed का उपयोग करने में दिलचस्प हूँ।

+1

एनबी। 'sed -r 's/1 9 2 \ .168 (\। [0-9] *) {2} /192.168.15 \ 1/g'' एक ही परिणाम प्राप्त करता है, पिछला संदर्भ' \ 1' दूसरा देता है दो '(\। [0-9] *) {2}' और regexp के दोहराव से बचाता है। – potong

+0

यह क्लीनर है, अभिव्यक्ति करते समय आलसी 'sed -r'/1 9 2 \ .168 (\। ?? [0-9] *) {2} /192.168.15 \ 1/g'' अभिव्यक्ति करते समय भी मदद करता है 3 भाग के मामले के पीछे पीछे '.' के साथ। –

उत्तर

8

ब्रेसिज़ से बचने की कोई आवश्यकता नहीं है क्योंकि ([0-9]*) प्रतीकों के वैध विवरण मिलान समूह है।

$> echo "192.168.0.1" | sed -r 's/192\.168\.[0-9]*\.([0-9]*)/192\.168\.15\.\1/g' 
192.168.15.1 
+0

ध्यान दें कि यदि आप फ़ाइल में बदल रहे हैं, तो -इर काम नहीं कर सकता है। यदि ऐसा है, तो आपको 'sed -i -r' s /.../.../ file'' (या वर्तनी वाले संस्करणों का उपयोग करके: 'sed -in-place' में अलग-अलग विकल्पों को पारित करने की आवश्यकता है। --regexp- विस्तारित/s.....// फ़ाइल'')। – waldyrious

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