2011-07-20 16 views
11

पर ठीक काम करता है यह Linux (Debian) पर ठीक काम करता है:Sed regex समस्या, लिनक्स

sed -e 's,^[ \t]*psd\(.*\)\;,,' 

मैक पर, मेरा मानना ​​है कि मैं -E झंडा उपयोग करने के लिए है, -e के बजाय:

sed -E 's,^[ \t]*psd\(.*\)\;,,' 

लेकिन regexp मेल नहीं खाता है, और इसलिए मैं चाहता हूं कि लाइनों को हटा नहीं है।

यह कैसे हल करने के लिए पर कोई सुझाव दिए गए?

नमूना इनपुट:

apa 
bepa 
    psd(cepa); 
depa psd(epa); 
    psd(fepa gepa hepa); 

कि इनपुट के लिए, अपेक्षित आउटपुट है:

apa 
bepa 
depa psd(epa); 
+1

आपके अपेक्षित आउटपुट में कुछ रिक्त रेखाएं होनी चाहिए। आपको अर्धविराम से बचने की जरूरत नहीं है। –

उत्तर

9

-E झंडा विस्तारित नियमित अभिव्यक्ति का उपयोग करने का मतलब है। लिनक्स पर आपको केवल -e का उपयोग करना चाहिए। मैक ओएस एक्स में sed बीएसडी sed पर आधारित है, इसलिए जीएनयू एक्सटेंशन नहीं हैं।

अपने नमूना इनपुट कॉपी करने के बाद:

[~ 507] pbpaste | sed -e 's,^[[:space:]]*psd\(.*\);,,' 
apa 
bepa 

depa psd(epa); 
+1

'-E' भी gnu sed पर काम करता है, यह एक अनियंत्रित विकल्प है जिसे उन्होंने पॉज़िक्स – NDM

2

मैं अपने मशीन पर इस नमूने इनपुट की जाँच है और इस समस्या का सामना करना पड़ा जब तीसरी लाइन में लाइन और regexp ^[ \t]*psd\(.*\)\; की शुरुआत से टैब वर्ण से मेल नहीं खाती थी यह। इसे sed चरित्र वर्ग [[:blank:]] द्वारा पारित किया जा सकता है जो अंतरिक्ष और टैब वर्ण के बराबर संयोजन है। तो आप निम्नलिखित की कोशिश कर सकते हैं:

sed -E 's,^[[:blank:]]*psd\(.*\)\;,,' demo.txt 

इस निम्नलिखित उत्पादन का उत्पादन:

apa 
bepa 

depa psd(epa); 

लेकिन यह परिणाम में खाली लाइनों रहता है। सटीक उत्पादन प्राप्त करने के लिए के रूप में आप की उम्मीद मैं निम्नलिखित प्रयोग किया है:

sed -n '/^[[:blank:]]*psd\(.*\)\;/!p' demo.txt 

परिणाम:

apa 
bepa 
depa psd(epa); 

इस मिलान पैटर्न (!p) का सिर्फ उलटा उत्पादन होता है।

संपादित करें: sed (MacOSX) में regexp में टैब वर्णों से मेल करने के लिए आप भी से How can I insert a tab character with sed on OS X?

7

'\t''sed' में मानक नहीं है सिफारिश कोशिश कर सकते हैं, यह एक जीएनयू विस्तार है।

'tab' से मेल खाने के लिए, आपको अपनी स्क्रिप्ट में वास्तविक 'tab' डालना होगा। फ़ाइल में यह आसान है, खोल में कठिन है।

एक ही समस्या AIX, Salaris और HP-UX या अन्य UNIXes में हो सकता है।

+6

के साथ अनुपालन करने के लिए जोड़ा है, मैंने इसे अपने उत्तर में याद किया। आप हमेशा POSIX वर्ण वर्गों का उपयोग कर सकते हैं, या तो '[[: space:]]' या '[[: blank:]] 'काम करेगा। खोल में एक शाब्दिक टैब प्राप्त करने के लिए, ctrl-v दबाकर आपको अगले वर्ण के लिए एक शाब्दिक मिल जाएगा। –

6

वैकल्पिक रूप से आप मैक OSX द्वारा प्रदान की कार्यान्वयन के बजाय sed की जीएनयू संस्करण का उपयोग कर सकते हैं।

Mac portsudo port install gsed के लिए एक पोर्ट प्रदान करता है। इसे स्थापित करने के बाद आप sed के बजाय gsed का उपयोग कर सकते हैं।

+5

या 'ब्रूइंग लोगों के लिए' gnu-sed --default-names 'इंस्टॉल करें :) –

+1

उन लोगों के लिए जो @ एंटोनबाबेन्को पसंद करते हैं, बस ध्यान दें कि हाल के संस्करणों में'dedeault-names' को बहिष्कृत किया गया है। 'Brew install gnu-sed --with-default-names' ** का उपयोग करें और फिर इसके बजाय अपने टर्मिनल को फिर से खोलें **। –

4

उपरोक्त उत्तरों के अतिरिक्त, आप एक उपयोगी (लेकिन शैल-निर्भर) चाल का फायदा उठा सकते हैं। बैश में, एक शाब्दिक टैब वर्ण प्रस्तुत करने के लिए $'\t' का उपयोग करें। अपने Mac पर निम्नलिखित काम करता है:

sed -e 's,^[ '$'\t''*psd\(.*\);,,'

नोट कैसे पूरे एसईडी अभिव्यक्ति तीन concatenated तार की अब होते हैं।

यह चाल उपयोगी हो सकती है यदि आपको विशेष रूप से टैब वर्ण की आवश्यकता होती है, विशेष रूप से अन्य व्हाइटस्पेस से मेल खाने के बिना (यानी, [[:blank:]] बहुत समावेशी होगा)। उपर्युक्त के लिए, ध्वज आवश्यक नहीं है।