我需要使用Powershell替换ini文件中的标签,以获取以news_ *开头的多个文件。我写了一个脚本来查找标签,但不知道如何替换从标签到行尾的所有内容。
例如,如果ini文件具有:
[tag1] = A string
[tag2] = 1234567
[tag3] = Another string
我想用空字符串替换所有标记2,我写道:
$configFiles = Get-ChildItem . news* -rec
foreach ($file in $configFiles)
{
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace '[tag2] = ".*?"', '[tag2] = ' } |
Set-Content $file.PSPath
}
你能告诉我这个剧本有什么问题吗?
谢谢!
答案 0 :(得分:4)
您要匹配的字符串没有任何双引号。此外,正如注释中指出的TheIncorrigible1,您需要转义方括号,否则表达式的那部分将匹配为字符类(任何字符t
,{{1} },a
或g
)而不是文字子字符串" [tag2]"。
更改
2
到
$_ -replace '[tag2] = ".*?"', '[tag2] = '
问题就会消失。
$_ -replace '^(\[tag2\] = ).*', '$1'
是对第一个捕获组的反向引用(表达式中第一组括号之间的子匹配)。在这种情况下,您只需要用您想要保留的(捕获的)部件替换整条线。
你也可以通过使用正面的lookbehind断言来捕获组/反向引用:
$1
在匹配中使用了Lookaround断言,但它们匹配的内容并不会成为返回值的一部分。基本上,一个积极的外观断言意味着"寻找在此子表达式之前的东西"。