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

时间:2012-02-07 09:43:04

标签: powershell

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

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

$raw = $(gc raw.txt)

for($i = 0; $i -le 100; $i++)
{
    $raw | %{$_ -replace "bad", "good$($i)" } > output.txt
}

如何做到这一点?

3 个答案:

答案 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