Home > Software engineering >  Powershell -replace for perl users: how to replace-match-$1 in PowerShell?
Powershell -replace for perl users: how to replace-match-$1 in PowerShell?

Time:03-13

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 :
  • Related