说我有一个基于XML的模板字符串,在其中我必须替换自制的模板标记:
$template = '<Foo Name="${BAZ}">'
我想用一个值替换文字${BAZ}
。我认为使用区分大小写的-creplace
运算符是个好主意。如给定的那样,我既具有裸参数名称(BAZ
),又没有附加装饰(${
}
)及其值(42):
$param = 'BAZ'
$value = 42
因此,我首先使用-f
导出替换字符串,以将参数名称与其“标记”混合使用,同时小心地在格式字符串中转义文字{
和}
:>
$needle = '${{{0}}}' -f $param
# ${BAZ}
# at least when printed...
现在进入最后一幕:
$template -creplace $needle, $value
# <Foo Name="${BAZ}">
# so $needle does not seem to match the string '${BAZ}'
我似乎错过了(或过度补偿了)介于两者之间某处的逃逸……有人能把我从这块冰上拉下来吗? (我尝试了许多退格键,反引号,单引号和双引号的字符串的组合。仅出于上下文考虑:在我的真实脚本中,$template
是一个大的多行字符串,通过{ {1}},我希望它不是根源。)
编辑:经过更多的探索,我找到了一个可行的解决方案:通过放弃$template = Get-Content "template-file.xml"
改用.net的-creplace
方法,使以上Replace()
匹配模板:
$needle
因此,我很高兴得到任何答案,这些答案可以阐明为什么 $template.Replace($needle, $value)
# <Foo Name="42"/>
不合作,我能做些什么。
答案 0 :(得分:2)
在这种情况下,[regex]::escape()
应该可以解决问题。
$template = '<Foo Name="${BAZ}">'
$template -match [regex]::escape('${BAZ}')
$Matches
输出:
Name Value
---- -----
0 ${BAZ}
答案 1 :(得分:1)
-replace
是一个替换正则表达式的运算符。-creplace
仅使此正则表达式区分大小写。您遇到的问题是正则表达式本身,因为某些字符在正则表达式中起特殊作用。
您想要做的是转义此类字符:
$template -replace [regex]::escape($needle), $value
转义的模式如下:\$\{BAZ}