使用Powershell将字符串替换为行尾

时间:2018-01-23 18:35:48

标签: powershell

我需要使用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
}

你能告诉我这个剧本有什么问题吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

您要匹配的字符串没有任何双引号。此外,正如注释中指出的TheIncorrigible1,您需要转义方括号,否则表达式的那部分将匹配为字符类(任何字符t,{{1} },ag)而不是文字子字符串" [tag2]"。

更改

2

$_ -replace '[tag2] = ".*?"', '[tag2] = '

问题就会消失。

$_ -replace '^(\[tag2\] = ).*', '$1' 是对第一个捕获组的反向引用(表达式中第一组括号之间的子匹配)。在这种情况下,您只需要用您想要保留的(捕获的)部件替换整条线。

你也可以通过使用正面的lookbehind断言来捕获组/反向引用:

$1

在匹配中使用了Lookaround断言,但它们匹配的内容并不会成为返回值的一部分。基本上,一个积极的外观断言意味着"寻找在此子表达式之前的东西"。