2011-07-11 45 views
10

我有一個文本文件,其中包含很長的行。我需要從每一行中獲取一條信息,並且需要查看唯一值。我最初的想法是使用Select-String並用捕獲組指定正則表達式。我看了幾個其他職位,但沒有工作。這裏是快速和骯髒的C#等價物:選擇字符串來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中做到這一點?

UPDATE:

測試的答案,我意識到有一個額外的要求。每個源代碼行可以有多個匹配項。例如:

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

這工作除了獲得獨特的。如果我用select-object -Unique替換它,它完美地工作。就我個人而言,我發現這比「[正則表達式]」的答案更清晰。 – TrueWill

2

如果我跟着你:

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

UPDATE:

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