我想弄清楚如何用递增的值替换 txt 文件中多次重复的特定字符串。
我尝试实现的是以下内容:
我在一个表格中有多个 HTML 链接,每个链接都有完全相同的结尾,即:XYZ
我想使用 PowerShell 将 XYZ 更改为 1、2、3、4、5 等等。
(Get-Content c:\temp\test.txt).replace('XYZ', 'MyValue') |
Set-Content c:\temp\test.txt
这是为每次替换使用递增数字的“MyValue”部分,我不确定如何实现它。
最佳答案
提示:注意使用Get-Content | .... | Set-Content
由于 possible data loss 到同一个文件!它不适用于像您所做的那样在子表达式/分组表达式中读取文件,但将来要注意它(作为最佳实践)。归功于 @Ansgar Wiechers澄清。
解决方案:
您可以将回调函数定义为[Regex]::Replace (String, String, MatchEvaluator)
方法:
$global:counter = 0
$content = (Get-Content c:\temp\test.txt)
# Below can be used to verify it's working correctly instead of creating a file
# $content = "aXYZ","bXYZ","cXYZ","dXYZ","eXYZ"
$content | % {[Regex]::Replace($_, 'XYZ', {return $global:counter += 1}) } | Set-Content c:\temp\test.txt
输出将是:
a1
b2
c3
d4
e5
解释:
传递给 Replace
的参数如下:
- 要搜索匹配项的字符串。
- 要匹配的正则表达式模式。
- 检查每个匹配项并返回原始匹配字符串或替换字符串的自定义方法。
每次匹配正则表达式时,自定义方法都会递增计数器。不幸的是,出于某种原因,它要求您使用全局变量范围,如果不需要,这通常不是最佳实践(如评论中的 @Paxz 所述)。
作为@TessellatingHeckler发现,解决方案的第一个版本在 $content
变量上使用了 Replace
,这导致删除了所有换行符。您必须使用 Foreach-Object
(或 %
作为其别名)在每一行中进行替换。
关于powershell - 用增量值替换字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51708427/