Select-String to grep但只返回唯一的组

时间:2011-07-11 15:42:57

标签: regex powershell

我有一个包含很长行的文本文件。我需要来自每一行的一条信息,并且需要查看唯一值。我最初的想法是使用Select-String并指定带有捕获组的正则表达式。我看了几个其他的帖子,但都没有用。这是快速而肮脏的C#等价物:

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

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分: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

答案 2 :(得分:1)

根据你的意见:

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

注意:${file-path}读取文件Get-Content,但file-path必须是绝对的!