2013-01-08 13 views
5

मैं रेगुलर एक्सप्रेशन निम्नलिखित पैटर्न मिलान करने के लिए लिखने की ज़रूरत मैच के लिए अंडरस्कोर से अलगनियमित अभिव्यक्ति awk आदेश के अंदर एक पैटर्न

उदाहरण के लिए

: मैं निम्नलिखित मैच के लिए एक नियमित अभिव्यक्ति की जरूरत है:

fltr_desc_name 
fltr_nameone_nametwo 
fltr_level_name_desc 

और मैं इसे अंदर उपयोग कर रहा हूँ एक "अगर" "awk" में बयान:

awk '/Transformation/ { if ($4=="Filter" && $5=="fltr_*") print $4,$5 }' filename 
: पूर्व के लिए

कृपया मुझे नियमित अभिव्यक्ति लिखने में मदद करें और मुझे बताएं कि "awk" कमांड के अंदर "if" स्थिति के अंदर नियमित अभिव्यक्ति का उपयोग कैसे करें। धन्यवाद।

+1

क्या आप अब तक की कोशिश की है !! और नियमित अभिव्यक्ति क्यों। उस – diEcho

+0

के लिए स्ट्रिंग फ़ंक्शन का उपयोग करें हैलो :), मैं उन सभी लाइनों को खोजने के लिए रेगेक्स का उपयोग कर रहा हूं जिनकी ट्रैनफॉर्मेशन फ़ील्ड प्रकार फ़िल्टर है, (यानी $ 4, फ़ाइल में दी गई चौथी फ़ील्ड) और $ 5 फ़िल्टर का नाम है जो प्रारूप के shld b "fltr_followedbyanywrdsseparatedbyunderscore"। और इसलिए मैं प्रश्न में दिखाए गए अजीब cmd का उपयोग कर रहा था, लेकिन मैं लाइनों को सुधारने में असमर्थ था। अंडरस्कोर के साथ समाप्त होने के लिए – Karthik

उत्तर

4

आप

awk '/Transformation/ && $4=="Filter" && match($5, /^fltr_[A-Za-z_]+/) { print $4,$5 }' filename 

कोई ज़रूरत नहीं इस्तेमाल कर सकते हैं एक if कथन का उपयोग करने के लिए, आप बस ऊपर के अनुसार बहु ​​मिलान शर्तों का उपयोग कर सकते हैं। match$5 में रेगेक्स ^fltr_[A-Za-z_]+ का मिलान स्थान लौटाता है, या 0 यदि कोई नहीं है तो 0। 0 झूठ का मूल्यांकन करता है और कुछ भी सच है।

+0

बहुत बहुत धन्यवाद।यह ठीक काम करता है :) चीयर्स – Karthik

+2

@ कार्तिक मैच() अनावश्यक है। आपकी मुख्य समस्या यह थी कि आप एक आरई तुलना ऑपरेटर (~) के बजाय एक स्ट्रिंग तुलना ऑपरेटर (==) का उपयोग कर रहे थे। मैं असली समाधान पोस्ट करूंगा। –

+0

@EdMorton, अच्छा - 'मैन अक्क' में रेगेक्स ऑपरेटर की तलाश में था, लेकिन यह अन्य ऑपरेटरों के बीच सूचीबद्ध नहीं था इसलिए मुझे याद आया और इसके बजाय 'मैच' के लिए चला गया। धन्यवाद! –

1

fltr_[a-zA-Z_]+[a-zA-Z]

या केवल स्ट्रिंग समाप्त करने के लिए शुरू आप स्ट्रिंग से मिलान करना चाहते हैं:

^fltr_[a-zA-Z_]+[a-zA-Z]$

+0

+1, भले ही इसे स्पष्ट रूप से –

+0

@ sharp12345 नहीं बताया गया था, आपके उत्तर के लिए धन्यवाद। :) – Karthik

0

तुम सिर्फ इस्तेमाल कर सकते हैं fltr_\w+

यदि आप लेखन के लिए एक अच्छा कार्यक्रम की जरूरत है और परीक्षण regex। यह एक कोशिश: http://gskinner.com/RegExr/

+0

ओपी अजीब चाहता है, नहीं perl। –

+0

@selltheworld आपके सुझाव और लिंक के लिए धन्यवाद :) – Karthik

0

प्रयास करें इस

^fltr[_\d\w]+$ 

यह सब ले जाएगा, आप की जरूरत है।

+0

ओपी चाहता है, न कि perl। इसके अतिरिक्त, '\ w' में' _' और '\ d' पहले से ही शामिल है - http://perldoc.perl.org/perlrecharclass.html#Word-characters –

+0

@og Grand, आपके उत्तर के लिए धन्यवाद। मैं भी आपके सुझाव का प्रयास करूंगा :) – Karthik

7
awk '/Transformation/ && $4=="Filter" && $5~/^fltr_[[:alpha:]_]+/ { print $4,$5 }' filename 
+1

+1। सामान्यता के लिए, मैं '[: alnum:] 'का उपयोग करता हूं, भले ही यह नहीं बताया गया था। –

+1

ओपी ने कहा कि स्ट्रिंग में "अंडरस्कोर से अलग शब्द" शामिल हैं और, मेरे सिर में कम से कम, ** शब्दों ** में संख्याएं नहीं हैं लेकिन वाईएमएमवी मुझे लगता है। –

+0

मैं इसे देख सकता हूं, विशेष रूप से 'fltr_nameone_nametwo' उदाहरण दिया गया है, लेकिन यह केवल शब्दों के संदर्भ में 'fltr_name1_name2' –

9

awk में रेगुलर एक्सप्रेशन से मेल खाते में टिल्ड चरित्र ~/ / उपयोग करने की आवश्यकता है, अर्थात

if ($5 ~ /fltr_*/) 
+0

यह वास्तव में मदद की – SeeTheC

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