Передача функции функции Powershell (replace)

Я хочу передать вызов функции (который возвращает строку) в качестве замены строки для функции замены Powershell, так что каждое найденное совпадение заменяется другой строкой.

Что-то вроде -

$global_counter = 0
Function callback()
{
    $global_counter += 1   
    return "string" + $global_counter
}

$mystring -replace "match", callback()

Python позволяет это через функцию 're' модуля 'sub', которая принимает функцию обратного вызова в качестве входного. Поиск чего-то подобного

Ответ 1

Возможно, вы ищете Regex.Replace Method (String, MatchEvaluator). В PowerShell блок script может использоваться как MatchEvaluator. Внутри этого блока script $args[0] находится текущее совпадение.

$global_counter = 0
$callback = {
    $global_counter += 1
    "string-$($args[0])-" + $global_counter
}

$re = [regex]"match"
$re.Replace('zzz match match xxx', $callback)

Вывод:

zzz string-match-1 string-match-2 xxx

Ответ 2

В PowerShell нет (пока?) поддержки для передачи блока script оператору -replace. Единственный вариант здесь - напрямую использовать [Regex]::Replace:

[Regex]::Replace($mystring, 'match', {callback})