2012-06-13 21 views
7

मैं लिनक्सस्कोप

(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$)) 

की ग्रेप कमांड के साथ रेगुलर एक्सप्रेशन का उपयोग करने के लिए जब मैंने इसे एक फ़ाइल की सामग्री के साथ https://www.regextester.com पर बाहर कोशिश कर रहा हूँ कोशिश कर रहा हूँ, मैं आवश्यक परिणाम हो रही है , यानी, आवश्यक फ़ील्ड मिलान किया जा रहा है लेकिन जब मैं के रूप में

grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1 

सभी इसका इस्तेमाल करने की कोशिश कर रहा हूँ यह मुझे एक अशक्त है देता है!

यहां समस्या क्या है?

उत्तर

2
pcregrep -M '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' 

चाल :)

3

मुझे नहीं लगता कि grep\w और \s जैसे वर्ण वर्गों को समझता है। grep -E या egrep का उपयोग करने का प्रयास करें। (grep -Eegrep के बराबर है, egrep टाइप करने के लिए सिर्फ कम है।)

तो अपने कमांड यह होगी:

egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1 
+0

यह अच्छा है लेकिन मैं एक multiline खोज कैसे करूँ? मानते हुए grep लाइन द्वारा लाइन काम करता है .. मुझे एक बहु लाइन खोज चाहिए .. तो क्या कोई समाधान है? –

+1

@ किरण वेमुरी यह एक अलग सवाल है जिसे आपने यहां देखा था। उस विषय को [इस SO सवाल] द्वारा कवर किया गया है (http: // stackoverflow।कॉम/प्रश्न/152708/कैसे-एक-मल्टीलाइन-पैटर्न-इन-ए-फाइल-उपयोग-pcregrep) –

+0

डिफ़ॉल्ट रूप से, egrep को समझ में नहीं आता है या \ w या तो। हालांकि, यदि पीसीआरई संकलित किया गया है तो आप --perl-regexp ध्वज का उपयोग कर सकते हैं। –

0

grep(1) डिफ़ॉल्ट रूप से POSIX Basic Regular Expressions का उपयोग करता था, और POSIX Extended Regular Expressions जब -E विकल्प के साथ उपयोग किया जाता है।

POSIX Regular Expressions में गैर-विशेष पात्रों ने बचने के दौरान व्यवहार को अपरिभाषित किया है, पूर्व। \s, और गैर लालची मिलान के लिए कोई वाक्यविन्यास नहीं है, पूर्व। +?। इसके अलावा, बीआरई में, + और | ऑपरेटर उपलब्ध नहीं हैं, और समूहकरण करने के लिए ब्रांड्स को बचाना होगा।

POSIX character classes[[:space:]] और [[:alnum:]_]\s और \w क्रमशः के लिए एक पोर्टेबल विकल्प हैं।

पुनरावृत्ति से अगले मिलान करने वाले चरित्र को छोड़कर गैर-लालची मिलान, पूर्व का अनुकरण करने के लिए उपयोग किया जा सकता है। [^*]+?\w*: बराबर से [^*[:alnum:]_:]+[[:alnum:]_]*: है।

grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \ 
    -e '[^*]\{1,\}\.com\.au$' file1 

या एक ERE:

grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \ 
    file1 

ध्यान दें कि grep(1) की जीएनयू कार्यान्वयन दोनों लघु चरित्र वर्गों (\s और \w के लिए अनुमति देता

दिया नियमित अभिव्यक्ति कई बीआरईएस के रूप में प्रतिनिधित्व किया जा सकता है) और गैर-लालची पुनरावृत्ति (+?), गैर-पोर्टेबल एक्सटेंशन के रूप में।

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