Подтвердить что ты не робот

Выберите-String для grep, но просто верните уникальные группы

У меня есть текстовый файл, содержащий очень длинные строки. Мне нужна одна часть информации из каждой строки, и вам нужно увидеть уникальные значения. Моя первоначальная мысль заключалась в том, чтобы использовать Select-String и указать регулярное выражение с группой захвата. Я просмотрел несколько других сообщений, но никто не работал. Здесь быстрый и грязный эквивалент С#:

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
4b9b3361

Ответ 1

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

Ответ 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

Ответ 3

Согласно вашим комментариям:

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

Будьте осторожны: ${file-path} читает файл типа Get-Content, но file-path должен быть абсолютным!