Take a look at this perl code:
$x = "this is a test 123 ... this is only a test"
$x =~ s/"test\s (\d )"/"test $1"/
print $x
this is a test 123 ... this is only a test
Notice that I match a number with regex (\d ), it gets put into the temporary variable $1, then it gets put in the output string as an expansion of $1 temporary variable...
Is there a way to do above perl replacement in powershell? I'm thinking if its possible then its something like this??
$x = "this is a test 123 ... this is only a test"
$x = $x -replace "test\s (\d )", "test $Matches[1]"
write-host $x
this is a test 123 ... this is only a test
Of course it doesn't work... I was curious how to do this since i have a lot of perl scripts to convert to PowerShell..
CodePudding user response:
Not that different in PowerShell:
$x = "this is a test 123 ... this is only a test"
$x = $x -replace 'test\s (\d )', 'test $1'
Write-Host $x
Output:
this is a test 123 ... this is only a test
Regex details:
test Match the characters “test” literally
\s Match a single character that is a “whitespace character” (spaces, tabs, line breaks, etc.)
Between one and unlimited times, as many times as possible, giving back as needed (greedy)
( Match the regular expression below and capture its match into backreference number 1
\d Match a single digit 0..9
Between one and unlimited times, as many times as possible, giving back as needed (greedy)
)
You can find out more here
CodePudding user response:
There's another way in powershell 7 with script blocks { }
. You also need the subexpression operator $( )
to refer to object properties or arrays inside a string. I'm just saving $_
to $a
so you can look at it. It's a little more convoluted, but sometimes the timing of '$1'
(note the single quotes) isn't what you need, like if you want to add to it.
"this is a test 123 ... this is only a test" -replace "test\s (\d )",
{ $a = $_ ; "test $(1 $_.groups[1].value)" }
this is a test 124 ... this is only a test
$a
Groups : {0, 1}
Success : True
Name : 0
Captures : {0}
Index : 10
Length : 13
Value : test 123
ValueSpan :