I'm trying to extract text from a set of files on Windows using the Powershell (version 4):
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table So far, so good. That gives a nice set of MatchInfo objects:
IgnoreCase LineNumber Line Filename Pattern Matches ---------- ---------- ---- -------- ------- ------- True 30 ... file.jsp ... {...} Next, I see that the captures are in the matches member, so I take them out:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table Which gives:
Groups Success Captures Index Length Value ------ ------- -------- ----- ------ ----- {...} True {...} 49 47 ... or as list with | Format-List:
Groups : {matched text, captured group} Success : True Captures : {matched text} Index : 39 Length : 33 Value : matched text Here's where I stop, I have no idea how to go further and obtain a list of captured group elements.
I've tried adding another | ForEach-Object -MemberName Groups, but it seems to return the same as the above.
The closest I get is with | Select-Object -Property Groups, which indeed gives me what I'd expect (a list of sets):
Groups ------ {matched text, captured group} {matched text, captured group} ... But then I'm unable to extract the captured group from each of them, I tried with | Select-Object -Index 1 I get only one of those sets.
It seems that by adding | ForEach-Object { $_.Groups.Groups[1].Value } I got what I was looking for, but I don't understand why - so I can't be sure I would be able to get the right result when extending this method to whole sets of files.
Why is it working?
As a side note, this | ForEach-Object { $_.Groups[1].Value } (i.e. without the second .Groups) gives the same result.
I'd like to add that, upon further attempts, it seems the command can be shortened by removing the piped | Select-Object -Property Groups.
Have a look at the following
$a = "http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$' $a is now a MatchInfo ($a.gettype()) it contain a Matches property.
PS ps:\> $a.Matches Groups : {http://192.168.3.114:8080/compierews/, 192.168.3.114, compierews} Success : True Captures : {http://192.168.3.114:8080/compierews/} Index : 0 Length : 37 Value : http://192.168.3.114:8080/compierews/ in the groups member you'll find what you are looking for so you can write :
"http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$' | % {"IP is $($_.matches.groups[1]) and path is $($_.matches.groups[2])"} IP is 192.168.3.114 and path is compierews
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With