Ich versuche, mit Powershell (Version 4) Text aus einer Reihe von Dateien unter Windows zu extrahieren:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table
So weit, ist es gut. Das gibt eine schöne Reihe von MatchInfo
Objekten:
IgnoreCase LineNumber Line Filename Pattern Matches
---------- ---------- ---- -------- ------- -------
True 30 ... file.jsp ... {...}
Als nächstes sehe ich, dass sich die Captures im Match-Mitglied befinden, also nehme ich sie heraus:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table
Welches gibt:
Groups Success Captures Index Length Value
------ ------- -------- ----- ------ -----
{...} True {...} 49 47 ...
oder als Liste mit | Format-List
:
Groups : {matched text, captured group}
Success : True
Captures : {matched text}
Index : 39
Length : 33
Value : matched text
Hier höre ich auf. Ich habe keine Ahnung, wie ich weiter gehen und eine Liste der erfassten Gruppenelemente erhalten soll .
Ich habe versucht, ein weiteres hinzuzufügen | ForEach-Object -MemberName Groups
, aber es scheint dasselbe wie oben zurückzugeben.
Am nächsten komme ich mit | Select-Object -Property Groups
, was mir tatsächlich das gibt, was ich erwarten würde (eine Liste von Sets):
Groups
------
{matched text, captured group}
{matched text, captured group}
...
Aber dann kann ich die erfasste Gruppe nicht aus jedem von ihnen extrahieren. Ich habe versucht | Select-Object -Index 1
, nur eines dieser Sets zu erhalten.
Update: eine mögliche Lösung
Es scheint, dass | ForEach-Object { $_.Groups.Groups[1].Value }
ich durch Hinzufügen das bekommen habe, wonach ich gesucht habe, aber ich verstehe nicht warum - daher kann ich nicht sicher sein, ob ich das richtige Ergebnis erzielen kann, wenn ich diese Methode auf ganze Dateigruppen ausdehne.
Warum funktioniert es?
Als Randnotiz ergibt dies | ForEach-Object { $_.Groups[1].Value }
(dh ohne die Sekunde .Groups
) das gleiche Ergebnis.
Ich möchte hinzufügen, dass bei weiteren Versuchen der Befehl anscheinend durch Entfernen der Rohrleitungen verkürzt werden kann | Select-Object -Property Groups
.
0
, die selbst ein Match ist. In IhrerGroups
Fallkollektion gibt es also zwei Elemente: Übereinstimmung mit sich selbst und erste Erfassungsgruppe. Wenn Sie nur eine Gruppe erfassen möchten, müssen Sie diese mit angebenGroups[1]
.