2011-07-11 11 views
10

मेरे पास एक टेक्स्ट फ़ाइल है जिसमें बहुत लंबी लाइनें हैं। मुझे प्रत्येक पंक्ति से जानकारी का एक टुकड़ा चाहिए, और अद्वितीय मूल्यों को देखने की आवश्यकता है। मेरा मूल विचार चयन-स्ट्रिंग का उपयोग करना था और एक कैप्चर समूह के साथ नियमित अभिव्यक्ति निर्दिष्ट करना था। मैंने कई अन्य पदों पर ध्यान दिया है लेकिन कोई भी काम नहीं किया है। यहां त्वरित और गंदे सी # समतुल्य है:grep के लिए चयन-स्ट्रिंग लेकिन केवल अद्वितीय समूह लौटें

var text = File.ReadAllText(@"path\File.txt"); 
var r = new Regex("Path=\"(.*?)\""); 
var matches = r.Matches(text); 

var h = new HashSet<string>(); 

foreach(Match match in matches) 
{ 
    h.Add(match.Groups[1].Value); 
} 

foreach (var s in h) 
{ 
    Console.WriteLine(s); 
} 

मैं PowerShell में यह कैसे कर सकता हूं?

अद्यतन:

जवाब का परीक्षण, मुझे एहसास हुआ वहाँ एक अतिरिक्त आवश्यकता नहीं है। प्रति स्रोत लाइन के कई मिलान हो सकते हैं। उदाहरण:

Path="One" Path="Two" 
Path="Two" Path="Three"

परिणाम होना चाहिए:

One 
Two 
Three

उत्तर

16
select-string -path <filepath> -pattern 'Path=\"(.*?)\"' -allmatches | 
    foreach-object {$_.matches} | 
    foreach-object {$_.groups[1].value} | 
    Select-Object -Unique 
+0

कृपया ऊपर दिए गए अपडेट को देखें। साथ ही, ध्यान दें कि पाठ एक फ़ाइल से आता है। – TrueWill

+0

नई आवश्यकताओं के लिए अपडेट किया गया। – mjolinor

+0

यह अद्वितीय-अद्वितीय के अलावा काम करता है। अगर मैंने इसे चुनिंदा ऑब्जेक्ट के साथ बदल दिया- यूनिक ने पूरी तरह से काम किया। व्यक्तिगत रूप से मुझे '[regex]' उत्तरों की तुलना में यह स्पष्ट लगता है। – TrueWill

2

अगर मैं तुम्हें अनुसरण कर रहा हूं:

Get-Content file.txt | Foreach-Object { [regex]::match($_,'Path="(.*?)"').Groups[1].Value} | Select-Object -Unique 

अद्यतन:

PS > Select-String -Path file.txt -Pattern 'Path="([^"]+)"' -AllMatches | Select-Object -ExpandProperty Matches | Foreach-Object {$_.Groups[1].Value} | Select-Object -Unique 

One 
Two 
Three 
+0

कृपया ऊपर दिए गए अपडेट को देखें। और क्या यह चयन-स्ट्रिंग के साथ किया जा सकता है? – TrueWill

+0

चयन-स्ट्रिंग का उपयोग करके अपडेट किया गया। –

1

अपनी टिप्पणी के अनुसार:

${c:\silogix\t.txt} | % {[regex]::matches($_, 'Path="(.*?)"')} | % {$_.Groups[1].value} | Select-Object -Unique 

सावधान: ${file-path}Get-Content की तरह फ़ाइल पढ़ता है, लेकिन file-path पूर्ण किया जाना चाहिए!

+0

+1 - काम करता है, और छोटा। – TrueWill

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