使用Powershell替换到行尾的字符串

使用Powershell替换到行尾的字符串,powershell,Powershell,我需要使用Powershell替换ini文件中以news_u*开头的许多文件的标记。我写了一个脚本来查找标记,但不知道如何替换从标记到行尾的所有内容 例如,如果ini文件具有: [tag1] = A string [tag2] = 1234567 [tag3] = Another string 我想用一个空白字符串替换所有标记2,我写道: $configFiles = Get-ChildItem . news* -rec foreach ($file in $configFiles) {

我需要使用Powershell替换ini文件中以news_u*开头的许多文件的标记。我写了一个脚本来查找标记,但不知道如何替换从标记到行尾的所有内容

例如,如果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
}
你能告诉我这个脚本有什么问题吗


谢谢

要匹配的字符串没有任何双引号。此外,正如注释中指出的,您需要转义方括号,否则表达式的该部分将作为字符类(字符
t
a
g
、或
2
)而不是文字子字符串“[tag2]”进行匹配

改变

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

问题就会消失

$1
是对第一个捕获组(表达式中第一组括号之间的子匹配)的反向引用。在这种情况下,您将使用要保留的(捕获的)部分替换整个行

您也可以通过使用正向查找断言,在不捕获组/反向引用的情况下执行此操作:

$_ -replace '(?<=^\[tag2\] = ).*'

$--replace'(?要匹配的字符串没有任何双引号。此外,正如注释中指出的,您需要转义方括号,否则表达式的该部分将作为字符类匹配(任何字符
t
a
g
,或
2
)而不是文字子字符串“[tag2]”

改变

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

问题就会消失

$1
是对第一个捕获组(表达式中第一组括号之间的子匹配)的反向引用。在这种情况下,您将用要保留的(捕获的)部分替换整行

您也可以通过使用正向查找断言,在不捕获组/反向引用的情况下执行此操作:

$_ -replace '(?<=^\[tag2\] = ).*'

$\u-replace'(?别忘了他需要跳出括号,否则他正在搜索一个集合。谢谢!我跳出括号后就这样做了。'$1'是做什么的?这等同于“”?@HamletHub
'$1'
相当于您可以在其他语言的其他正则表达式语句中识别的
'\1'
。它是对第一个替换参数中捕获组
(\[tag2\]=)
的反向引用。@HamletHub顺便说一句。您不想使用
[tag1]
在构建ini时,只需使用
tag1=value
否则您声明的部分和语法错误。@theincorgible1确实不正确。我没有注意方括号。谢谢提醒。别忘了他需要跳出方括号,否则他正在搜索一个集合。谢谢!我跳出方括号后就这样做了“$1”的作用是什么?它相当于“?@HamletHub
“$1”
相当于您可以在其他语言的其他正则表达式语句中识别的
'\1'
。它是对第一个替换参数中捕获组
(\[tag2\]=)
的反向引用。@HamletHub btw.您不想使用
[tag1]
构建ini时,只需使用
tag1=value
否则您声明的节和语法错误。@它们确实不正确。我没有注意方括号。谢谢提醒。