Powershell 动态替换文件中出现的每个字符串

Powershell 动态替换文件中出现的每个字符串,powershell,Powershell,我有一些文本文件,其中出现了一些字符串“bad”。我想用good1,good2,good3,good100等等来替换每次出现的“bad” 我正在尝试,但它正在用最后一个数字good100替换所有出现的情况 $raw = $(gc raw.txt) for($i = 0; $i -le 100; $i++) { $raw | %{$_ -replace "bad", "good$($i)" } > output.txt } 如何做到这一点?试试这个: $i = 1 $raw =

我有一些文本文件,其中出现了一些字符串“bad”。我想用
good1
good2
good3
good100等等来替换每次出现的“bad”

我正在尝试,但它正在用最后一个数字good100替换所有出现的情况

$raw = $(gc raw.txt)

for($i = 0; $i -le 100; $i++)
{
    $raw | %{$_ -replace "bad", "good$($i)" } > output.txt
}
如何做到这一点?

试试这个:

$i = 1
$raw = $(gc raw.txt)
$new = $raw.split(" ") | % { $_ -replace "bad" , "good($i)" ; if ($_ -eq "bad" ) {$i++} }
$new -join " " | out-file output.txt
如果raw.txt是单行,并且包含单词“bad”总是由一个空格分隔,这是很好的,比如:alfa bad beta bad gamma bad(等等…)

评论后编辑:

对于多行文本:

$i = 1
$new = @()
$raw = $(gc raw.txt)
for( $c = 0 ; $c -lt $raw.length ; $c++ )
{
 $l =   $raw[$c].split(" ") | % { $_ -replace "bad" , "good($i)" ; if ($_ -eq "bad" ) {$i++} }
 $l = $l -join " " 
 $new += $l
 }

 $new | out-file output.txt

对于这种情况,我通常使用Regex::Replace重载,该重载使用Matchevaluator:

$evaluator ={
$count++
"good$count"
}

gc raw.txt | %{ [Regex]::Replace($_,"bad",$evaluator) }

evaluator还将匹配的组作为参数获取,因此您可以使用它进行一些高级替换。

还有另一种方法,一次只替换一个匹配项:

$raw = gc raw.txt | out-string
$occurrences=[regex]::matches($raw,'bad')
$regex = [regex]'bad'

for($i=0; $i -le $occurrences.count; $i++)
{
    $raw = $regex.replace($raw,{"good$i"},1)
}

$raw

我认为没有split方法,因为它会抛出一个错误,说明这种方法不存在。不应该是
split()
更好吗?你能试试这个:$raw.gettype()并告诉我是否返回[string]吗?字符串类型有split()方法!从
Get Content
返回的对象数组没有拆分方法。您需要使用foreach。您可以将其转换为字符串,然后使用split
[string](gcraw.txt)