Select-String для grep, но просто вернуть уникальные группы - PullRequest
10 голосов
/ 11 июля 2011

У меня есть текстовый файл, который содержит очень длинные строки.Мне нужна одна информация из каждой строки, и мне нужно увидеть уникальные значения.Первоначально я думал использовать 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 ]

16 голосов
/ 11 июля 2011
select-string -path <filepath> -pattern 'Path=\"(.*?)\"' -allmatches  |
  foreach-object {$_.matches} |
   foreach-object {$_.groups[1].value} |
    Select-Object -Unique
2 голосов
/ 11 июля 2011

Если я следую за тобой:

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
1 голос
/ 11 июля 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...