我正在尝试使用powershell替换.config文件中的句子。
${c:Web.config} = ${c:Web.config} -replace
'$BASE_PATH
$ \ Test \ bin` $ Test_TYPE` $ \ WebTest.dll','c:\ program Files \ example \ webtest.dll'
每次我尝试运行上面的代码我都会
“无效的正则表达式模式: $ BASE_PATH $ \测试\ BIN \ $ Test_TYPE $ \ WebTest.dll” 在c:\ tests \ runtesting.ps1 -replace <<<< $ $ BASE_PATH \测试\ BIN \ $ Test_TYPE $ \ WebTest.dll
如果我不使用反击,美元符号将会消失,并会显示一些文字。
如何将字符串中的美元符号传递给 - 替换?
答案 0 :(得分:5)
这是关于如何逃避正则表达式的 。应该使用$
\
'$A$B()[].?etc' -replace '\$|\(|\)|\[|\]|\.|\?','x'
'$BASE_PATH$\Test\bin$Test_TYPE$\WebTest.dll' -replace '\$BASE_PATH\$\\Test\\bin\$Test_TYPE\$\\WebTest.dll','something'
当正则表达式如下时,将使用反引号:
'$A$B' -replace "\`$",'x'
答案 1 :(得分:4)
通过:
$BASE_PATH$\Test\bin\$Test_TYPE$\WebTest.dll
更改为:
`"\`$BASE_PATH\`$\\Test\\bin\\\`$Test_TYPE\`$\\WebTest.dll"`
逻辑:
答案 2 :(得分:1)
为了向stej's answer提供更多背景知识,这里有两件事:
1)在解析命令时,powershell在-replace
的字符串参数中为expanding the variables(例如,字符串"shell: $ShellId"
将展开{{} 1}}变量,产生ShellId
)。使用反引号转义字符或使用单引号声明字符串可以防止这种情况(shell: Microsoft.PowerShell
和"shell: `$ShellId"
变为'shell: $ShellId'
)。
2) shell: $ShellId
运算符使用.NET regular expressions,其中-replace
,$
和\
字符是特殊语言元素。使用反斜杠转义字符可以将特殊字符视为正则表达式中的文字值(例如.
将匹配一个美元字符,而\$
将匹配该行的结尾)。由于powershell和正则表达式都使用$
,因此必须将其转义两次(使用$
或"\`$"
)。
在这种情况下,另一种方法是使用string.Replace
方法,它将执行区分大小写的替换:
'\$'
答案 3 :(得分:1)
对于那些不熟悉这种区别的人,重要的是不要将反引号字符(`)与单引号字符混淆<在这些逃脱中强>(')。例如:
[SUCCESS] 将双引号用作带反斜杠后缀的容器作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\`$old", "(New)"}
What is (New)?
PS C:\Temp>
[FAIL] 将双引号用作带反斜杠撇号的容器作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace "\'$old", "(New)"}
What is $old?
PS C:\Temp>
[SUCCESS] 单引号作为容器,带有简单的反斜杠作为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\$old', "(New)"}
What is (New)?
PS C:\Temp>
[FAIL] 单引号作为容器,反斜杠 - 反引号为转义:
PS C:\Temp> 'What is $old?' | ForEach-Object {$_ -replace '\`$old', "(New)"}
What is $old?
PS C:\Temp>
总的来说,最简单的选择可能是使用单引号作为容器,使用单个反斜杠作为转义:'\$old'