2011-07-11 11 views
10

Mam plik tekstowy zawierający bardzo długie wiersze. Potrzebuję jednej informacji z każdej linii i muszę zobaczyć unikalne wartości. Moją pierwotną myślą było użycie Select-String i określenie wyrażenia regularnego z grupą przechwytującą. Sprawdziłem kilka innych postów, ale żaden nie działał. Oto szybki i-brudny C# równoważne:Wybierz ciąg do grep, ale po prostu zwróć unikalne grupy.

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); 
} 

Jak mogę to zrobić w PowerShell?

UPDATE:

Testowanie odpowiedzi, zdałem sobie sprawę, istnieje dodatkowy wymóg. W wierszu źródłowym może być wiele dopasowań. Przykład:

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

Wyniki powinny być:

One 
Two 
Three

Odpowiedz

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

Proszę zobaczyć aktualizację powyżej. Zwróć też uwagę, że tekst pochodzi z pliku. – TrueWill

+0

Zaktualizowano dla nowych wymagań. – mjolinor

+0

To działało, z wyjątkiem unikalności. Jeśli zastąpiłem to wybranym-obiektem -Unique, zadziałało idealnie. Osobiście uważam to za jaśniejsze niż odpowiedzi "[regex]". – TrueWill

2

Jeśli Obserwuję cię:

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

Proszę zobaczyć aktualizację powyżej. I czy można to zrobić za pomocą łańcucha wyboru? – TrueWill

+0

Zaktualizowano za pomocą Select-String. –

1

Według komentarze:

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

Bądź ostrożny: ${file-path} odczytuje plik jak Get-Content, ale file-path musi być absolutna!

+0

+1 - działa i jest krótki. – TrueWill

Powiązane problemy