2009-03-05 21 views
18

में रेगेक्स बैकरेफर/मैच के मूल्य को आप कैसे निकालते हैं मेरे पास एक टेक्स्ट फ़ाइल है जिसमें डेटा की रेखाएं हैं। मैं लाइनों मैं में दिलचस्पी रखता हूँ निकालने के लिए निम्नलिखित powershell स्क्रिप्ट का उपयोग कर सकते हैं:पावरहेल

select-string -path *.txt -pattern "subject=([A-Z\.]+)," 

कुछ उदाहरण डेटा होगा:

blah blah subject=THIS.IS.TEST.DATA, blah blah blah 

क्या मैं चाहता हूँ सिर्फ वास्तविक सामग्री को निकालने के लिए सक्षम होने के लिए है विषय का (यानी "THIS.IS.TEST.DATA" स्ट्रिंग)। मैंने यह कोशिश की:

select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0] } 

लेकिन "मिलान" संपत्ति हमेशा शून्य होती है। मैं क्या गलत कर रहा हूं?

उत्तर

9

पर इन नोटों देखें मैं क्यों अपने संस्करण काम नहीं करता है पता नहीं है। यह काम करना चाहिए। यहां एक उग्र संस्करण है जो काम करता है।

$p = "subject=([A-Z\.]+)," 
select-string -path *.txt -pattern $p | % {$_ -match $p > $null; $matches[1]} 

संपादित करें। dant के लिए स्पष्टीकरण:

>"foobar" -match "oo.ar" 
True 

> $null सिर्फ सच उत्पादन के लिए लिखा जा रहा को दबा:

-match एक नियमित अभिव्यक्ति मिलान ऑपरेटर है। (इसे हटाने का प्रयास करें।) एक cmdlet है जो वही काम करता है जिसका नाम मुझे इस समय याद नहीं है।

$matches एक जादू चर है जो अंतिम -match ऑपरेशन का परिणाम रखता है।

+0

धन्यवाद, कि काम करता है, लेकिन आप क्या कर रहे हैं समझा सकता है? विशेष रूप से "$ _-$ $ $> $ शून्य" बिट। – d4nt

+1

cmdlet dangph "आउट-नल" की सोच रहा है। लेकिन आप पूरी लाइन को [void] पर भी डाल सकते हैं: [शून्य] ($ _ -match $ p) – JasonMArcher

2

आपके द्वारा टाइप किए जा रहे कोड के साथ समस्या यह है कि चयन-स्ट्रिंग वास्तविक Regex ऑब्जेक्ट को पास नहीं करती है। इसके बजाय यह MatchInfo नामक एक अलग वर्ग को पास करता है जिसमें वास्तविक रेगेक्स मैचों की जानकारी नहीं होती है।

यदि आप केवल एक बार रेगेक्स को चलाने के लिए चाहते हैं, तो आपको अपने स्वयं के फ़ंक्शन को रोल करना होगा जो बहुत मुश्किल नहीं है।

gci *.txt | gc | %{ [regex]::matches($_, "subject=([A-Z\.]+),") } | %{ $_.Groups[1].Value } 

यह के रूप में अच्छा लगा:

function Select-Match() { 
    param ($pattern = $(throw "Need a pattern"), 
     $filePath = $(throw "Need a file path")) 
    foreach ($cur in (gc $filePath)) { 
    if ($cur -match $pattern) { 
     write-output $matches[0]; 
    } 
    } 
} 

gci *.txt | %{ Select-Match "subject=([A-Z\.]+)," $_.FullName } 
+0

लेकिन MatchInfo.Matches प्रॉपर्टी क्यों काम नहीं करती है? http://msdn.microsoft.com/en-us/library/microsoft.powershell.commands.matchinfo.matches(VS.85).aspx –

+0

@ डैन्ग, मुझे विश्वास है कि दस्तावेज़ों में एक बग है। आप "gci a * .txt | gm" चलाकर इसे सत्यापित कर सकते हैं। परिणामस्वरूप प्रकार में कोई मिलान संपत्ति नहीं है। – JaredPar

+0

जेरेडपार, जो मेरे लिए काम नहीं करता था, लेकिन मेरा मानना ​​है कि आप सही हैं। इसे आज़माएं: "gm -inputobject (नया ऑब्जेक्ट Microsoft.PowerShell.Commands.MatchInfo)"। –

2

फिर भी एक और विकल्प

gci *.txt | foreach { [regex]::match($_,'(?<=subject=)([^,]+)').value } 
2

सभी अन्य उत्तर मैं मैं क्या निम्न पंक्ति का उपयोग कर चाहते करने में सक्षम था से बहुत कुछ सीखा करने के बाद मैं केवल प्रति पंक्ति एक बार रेगेक्स चला रहा था और क्योंकि मैं कमांड प्रॉम्प्ट पर इसे दर्ज कर रहा था, यह अच्छा था कि कोड की कई पंक्तियां न हों।

+0

खुशी है कि आपको एक समाधान मिला। मैंने सिर्फ v2 में चेक किया है और मैचों की संपत्ति चयन-स्ट्रिंग से काम करता है। तो भविष्य में यह आपके लिए कम दर्दनाक होगा। :) – JasonMArcher

0

एक और भिन्नता,

echo "123456789 hello test" | % {$_ -match "\d{7}" > $null; $matches[0]} 

रिटर्न एक स्ट्रिंग में 7 अंक मिलान: 1234567

4

PowerShell V2 CTP3 में, मेल खाता संपत्ति कार्यान्वित किया जाता है।तो निम्नलिखित काम करेगा:

select-string -path *.txt -pattern "subject=([A-Z\.]+)," | %{ $_.Matches[0].Groups[1].Value } 
1

करें-स्ट्रिंग आदेश एक MatchInfo चर और नहीं "स्ट्रिंग" चर वापस जाने के लिए लगता है। मैंने इसे भाग्य और आधिकारिक वेबसाइट पर बिना किसी किस्मत के कई घंटे बिताए। मैं अभी भी जानकारी एकत्र कर रहा हूं। इस के चारों ओर एक रास्ता एक स्ट्रिंग चर स्पष्ट रूप से घोषित करने के लिए परिणाम धारण करने के लिए है का चयन-स्ट्रिंग से लौटे अपने उदाहरण से:

[स्ट्रिंग] $ foo = चयन स्ट्रिंग -path * .txt -pattern " विषय = ([एजेड।] +), "

$ foo चर अब एक स्ट्रिंग है और MatchInfo ऑब्जेक्ट नहीं है।

उम्मीद है कि इससे मदद मिलती है।

PS5 powershell संस्करण 5 स्ट्रिंग तार हेरफेर