用递增值替换字符

时间:2018-08-06 13:08:31

标签: powershell

我正在尝试找出如何用递增值替换某个在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”部分,我不确定如何实现。

2 个答案:

答案 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的参数如下:

  1. 要搜索匹配项的字符串。
  2. 要匹配的正则表达式模式。
  3. 一种自定义方法,它检查每个匹配项并返回原始匹配的字符串或替换字符串。

每次匹配正则表达式时,自定义方法都会递增计数器。不幸的是,由于某种原因,它要求您使用全局变量范围,如果不需要,通常不是最佳实践(如评论中的@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替换为数字。然后,将其保存到一个新变量中,该变量随后将用于将新内容写入文件。