Использование функции в Powershell replace
Я пытаюсь заменить часть строки в PowerShell. Однако строка замены не является жестко закодированной, она вычисляется из функции:
$text = "the image is -12345-"
$text = $text -replace "-(d*)-", 'This is the image: '
Write-Host $text
это дает мне правильный результат: "Это изображение: 12345"
теперь я хочу включить кодированное изображение base64. Я могу прочитать изображение по id. Я надеялся, что сработает следующее, Но это не так:
function Get-Base64($path)
{
[convert]::ToBase64String((get-content $path -encoding byte))
}
$text -replace "-(d*)-", "This is the image: $(Get-Base64 '')"
причина в том, что он не работает, потому что он сначала проходит (the строка, а не значение
) к функции, выполняет ее и только после этого выполняет замену. Что я хочу сделать, это
- найти появление шаблона
- замените каждое событие шаблоном
- для каждой замене:
- передайте группу захвата функции
- используйте значение группы захвата, чтобы получить изображение base64
- вставьте изображение base64 в замену
2 ответов
вы можете использовать static Replace
метод [regex]
класс:
[regex]::Replace($text,'-(\d*)-',{param($match) "This is the image: $(Get-Base64 $match.Groups[1].Value)"})
в качестве альтернативы вы можете определить regex
объект и использовать Replace
метод этого объекта:
$re = [regex]'-(\d*)-'
$re.Replace($text, {param($match) "This is the image: $(Get-Base64 $match.Groups[1].Value)"})
для лучшей читаемости вы можете определить функцию обратного вызова (scriptblock) в отдельной переменной и использовать ее в замене:
$callback = {
param($match)
'This is the image: ' + (Get-Base64 $match.Groups[1].Value)
}
$re = [regex]'-(\d*)-'
$re.Replace($text, $callback)
полезный ответ PetSerAl - это ваш единственный вариант в Windows PowerShell, по состоянию на У5.1.
PowerShell базовый v6.1 + теперь предлагает собственное решение PowerShell с помощью улучшения-replace
оператор, что устраняет необходимость вызова [regex]::Replace()
:
$text -replace "-(\d*)-", { param($match)
"This is the image: $(Get-Base64 $match.Groups[1].Value)"
}