我有一些文本文件,其中出现了一些字符串“bad”。我想用good1
,good2
,good3
,,, good100等替换每次出现的“坏”。
我正在尝试这个但是它用最后一个数字替换所有出现的数字,good100
$raw = $(gc raw.txt)
for($i = 0; $i -le 100; $i++)
{
$raw | %{$_ -replace "bad", "good$($i)" } > output.txt
}
如何做到这一点?
答案 0 :(得分:3)
试试这个:
$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(等等......)
评论后编辑:
for multiline txt:
$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
答案 1 :(得分:2)
对于这样的事情,我通常使用带有Matchevaluator的Regex :: Replace重载:
$evaluator ={
$count++
"good$count"
}
gc raw.txt | %{ [Regex]::Replace($_,"bad",$evaluator) }
评估者还将匹配的组作为参数获取,因此您可以使用它进行一些高级替换。
答案 2 :(得分:2)
这是另一种方式,一次只替换一个匹配:
$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