2013-02-11 7 views
11

मैं कॉन्फ़िगरेशन फ़ाइल में boots नामक पैकेज के सभी संदर्भों को प्रतिस्थापित करने का प्रयास कर रहा हूं।बूलियन या sed regex में

लाइन प्रारूप add fast (package OR pkg) boots-(any-other-text) है, जैसे:

add fast pkg boots-5.0 

मैं निम्नलिखित को आज़मा चुके sed आदेशों:

add fast package boots-2.3 
add fast pkg boots-4.5 

मैं के साथ इसे बदलना चाहते

sed -e 's/add fast (pkg\|package) boots-.*/add yinst pkg boots-5.0/g' 
sed -e 's/add fast [pkg\|package] boots-.*/add yinst pkg boots-5.0/g' 

क्या है सही regex? मुझे लगता है कि मुझे बूलियन में कुछ याद आ रहा है या (package या pkg) भाग।

उत्तर

19
sed -e 's/add fast \(pkg\|package\) boots-.*/add yinst pkg boots-5.0/g' 

तुम हमेशा इसे दो बार

sed 's/add fast pkg boots-.*/add yinst pkg boots-5.0/g 
s/add fast package boots-.*/add yinst pkg boots-5.0/g' 
+1

"दो बार" कमांड में सेमी कॉलन का उपयोग करना बेहतर है। इस तरह: 'sed' s/\। Ism/\। Ism \ .md5/g; s/\। Usp/\। Usp \ .md5/g '/ tmp/verify' –

+0

@EvgeniyYablokov कोई विशेष कारण? शायद छोटी फेंकने वाली स्क्रिप्ट्स (इस तरह की) में आपके पास एक बिंदु हो सकता है, लेकिन मुझे अभी भी लगता है कि दो-पंक्ति संस्करण पढ़ने में आसान है। – bobbogo

+0

मैं विंडोज़ पर जीएनयू-यूटिल संस्करण का उपयोग कर रहा हूं @EvgeniyYablokov को काम करने के लिए सेमी-कॉलन के साथ सुझाव दिया था। – user1167442

7

आप बीआरई और ईआरई मिश्रण कर रहे हैं या तो () और | या कोई भी दोनों से बचें।

sed डिफ़ॉल्ट रूप से बुनियादी नियमित अभिव्यक्तियों का उपयोग करता है, विस्तारित नियमित अभिव्यक्तियों का उपयोग कार्यान्वयन पर निर्भर करता है, उदाहरण के लिए बीएसडी sed के साथ आप -E स्विच का उपयोग करते हैं, जीएनयू sed ने इसे -r के रूप में दस्तावेज किया है, लेकिन -E भी काम करता है।

14

उपयोग बढ़ाया regex मोड करके या से बचने के सकता है, और | बच नहीं है।

sed -E -e 's/add fast (pkg|package) boots-.*/add yinst pkg boots-5.0/g' 
+0

'sed: अवैध विकल्प - ई'। Red Hat पर 'जीएनयू sed संस्करण 4.1.5' के साथ काम नहीं कर रहा है। –

+2

@AdamMatan आह, जीएनयू sed के लिए '-r' ध्वज का उपयोग करें, क्योंकि थोर इंगित करता है। –

0

जीएनयू (लिनक्स):

1) यादृच्छिक तार

cidr="192.168.1.12" 
    cidr="192.168.1.12/32" 
    cidr="192.168.1.12,8.8.8.8" 

खाली

2) की तरह @ जीएनयू में तार्किक ऑपरेटर का उपयोग करके -r साथ sed के लिए निम्न बनाओ थोर का उल्लेख है, और -ई पर फ्लाई पर एक फ़ाइल को संपादित करें

$ echo '<user id="1000" cidr="192.168.1.12">' > /tmp/1000.xml 
$ sed -r -i \ 
    s/'cidr="192.168.1.12\/32"|cidr="192.168.1.12"|192.168.1.12,'/''/ /tmp/1000.xml 

-r = GNU sed 
-i = search/match/ edit the changes to the file on the fly