我正在尝试找出如何用递增值替换某个在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”部分,我不确定如何实现。
答案 0 :(得分:3)
提示:由于possible data loss,请注意对同一文件使用Get-Content | .... | Set-Content
!它不适用于读取子表达式/分组表达式中的文件,但是以后请注意(作为最佳实践)。感谢@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发现,解决方案的第一个版本在变量Replace
上使用了$content
,导致删除了所有换行符。您必须使用Foreach-Object
(或%
作为别名)来替换每一行。
答案 1 :(得分:1)
与@robdy答案相同,但没有引用global
:
# Simulation of Get-Content
$content = "aXYZ","bXYZ","cXYZ","dXYZ","eXYZ"
$i = 0
$result = $content.ForEach({
$i++
$_ -replace 'XYZ', $i
})
$result | Out-File -FilePath "$env:TEMP\test.txt" -Encoding utf8 -NoClobber
我们基本上是遍历文件的内容,并将字符串XYZ
替换为数字。然后,将其保存到一个新变量中,该变量随后将用于将新内容写入文件。