2009-07-12 15 views
8

जब मैं पैटर्न में कई बार मिलान करता हूं तो मैं सभी मिलान समूहों पर कार्रवाई कैसे करूं?अजीब प्रत्येक पंक्ति से कई समूहों को निकालें

समझाने के लिए, मैं /Hello! (\d+)/ के लिए खोज करने के लिए और नंबरों का उपयोग, उदाहरण के लिए, उन्हें प्रिंट या योग उन्हें चाहते हैं, इसलिए निवेश के लिए

abcHello! 200 300 Hello! Hello! 400z3 
ads 
Hello! 0 

अगर मैं उन्हें प्रिंट करने का फैसला किया है, मैं उम्मीद थी

200 
400 
0 
+0

Googlers के लिए: ध्यान दें 'gawk' साथ कि, उर्फ। "जीएनयू अजीब", आप वास्तव में एक पंक्ति में शीर्षक (प्रश्न नहीं) कह सकते हैं (उदाहरण के लिए। पाइपिंग के माध्यम से): '| gawk -v आरएस = '' '{प्रिंट gensub (/()() /, "\\ 1 \\ 2", "जी"); } '': डी यह बहु-रेखा का समर्थन करता है (' -v आरएस =' ''' के कारण) और मिलान करने वाले उप-समूहों (गॉक के' जेनसब 'का उपयोग करने के कारण) !!! – Andrew

उत्तर

10

यह एक सरल वाक्य रचना है, और हर awk (nawk, mawk, घूर रहा, आदि): जब कोई निश्चित पाठ कि एक रिकार्ड विभाजक के रूप में काम कर सकते हैं और linefeeds अधिक से मेल नहीं खाता है यह भी पैटर्न के लिए काम करता है इसका उपयोग कर सकते हैं।

{ 
    while (match($0, /Hello! [0-9]+/)) { 
     pattern = substr($0, RSTART, RLENGTH); 
     sub(/Hello! /, "", pattern); 
     print pattern; 
     $0 = substr($0, RSTART + RLENGTH); 
    } 
} 
1

जीएनयू awk के उत्पादन

awk 'BEGIN{ RS="Hello! ";} 
{ 
    gsub(/[^0-9].*/,"",$1) 
    if ($1 != ""){ 
     print $1 
    } 
}' file 
+0

अच्छा है, लेकिन अधिक जटिल पैटर्न जैसे/([ए-जी] + | [एच-जेड] +)/और एक लाइनफीड से मेल खाएगा। –

+0

क्या आप एक उदाहरण प्रदान कर सकते हैं। – ghostdog74

0

यहहैवाक्यविन्यास।

{ 
    pattern = "([a-g]+|[h-z]+)" 
    while (match($0, pattern, arr)) 
    { 
     val = arr[1] 
     print val 
     sub(pattern, "") 
    } 
} 
0

लाइन में एक ही पैटर्न से कई बार मिलान करने के लिए कोई गॉक फ़ंक्शन नहीं है। जब तक आप बिल्कुल नहीं जानते कि पैटर्न कितनी बार दोहराता है।

ऐसा करने के बाद, आपको एक ही पंक्ति में सभी मैचों पर "मैन्युअल रूप से" पुनरावृत्ति करना होगा। अपने उदाहरण इनपुट के लिए, यह होगा: पैटर्न एक linefeed अधिक से मेल करेगा

{ 
    from = 0 
    pos = match($0, /Hello! ([0-9]+)/, val) 
    while(0 < pos) 
    { 
    print val[1] 
    from += pos + val[0, "length"] 
    pos = match(substr($0, from), /Hello! ([0-9]+)/, val) 
    } 
} 

हैं, तो आप इनपुट रिकॉर्ड विभाजक संशोधित करने के लिए है - आरएस

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