I saw this Powershell statement in a recent Hanselminutes post –
cat test.txt | foreach-object {$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x} | sort | get-unique
I’m trying to learn Powershell at the moment and I think that I understand most of what is going on –
- The statement loops through each line of ‘test.txt’ and runs a regex against the current line
- All the results are collated and then sorted and duplicates removed
My understanding seems to fall down on this part of the statement –
$null = $_ -match '<FancyPants>(?<x>.*)<.FancyPants>'; $matches.x
- What is the ‘
$null =‘ part of the code doing, I suspect this is
to handle a scenario when no match is returned but I’m not sure how
it works? - Is ‘
$matches.x‘ returning the matches found?
Yes, the
-matchoperator results inTrueorFalse; assigning to$nullsuppresses the output.The
(?<>)regex syntax creates a capture group. In this case it’s creating a capture group calledxfor any characters between<FancyPants>and<.FancyPants>.$matchescontains the match info for the last match. Capture groups can be referenced by$matches.CaptureGroupName.Here is an example you can use to see what is in the
$Matchesvariable.In this example you would use
$Matches.MyMatchto reference the match.