使用Powershell替换到行尾的字符串
我需要使用Powershell替换ini文件中以news_u*开头的许多文件的标记。我写了一个脚本来查找标记,但不知道如何替换从标记到行尾的所有内容 例如,如果ini文件具有:使用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) {
[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
否则您声明的节和语法错误。@它们确实不正确。我没有注意方括号。谢谢提醒。