Заменить каждое вхождение строки в файле динамически - PullRequest
3 голосов
/ 07 февраля 2012

У меня есть какой-то текстовый файл, в котором есть строки "bad". Я хочу заменить каждое вхождение «плохо» на good1, good2, good3, ,, good100 и т. Д.

Я пытаюсь это, но он заменяет все вхождения на последнее число, хорошо100

$raw = $(gc raw.txt)

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

Как это сделать?

Ответы [ 3 ]

3 голосов
/ 07 февраля 2012

Попробуйте это:

$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 состоит из одной строки и содержит слово «плохо», всегда разделяемое одним пробелом », например: 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
2 голосов
/ 08 февраля 2012

Вот еще один способ, заменяя только один матч за раз:

$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
2 голосов
/ 08 февраля 2012

Для таких вещей я обычно использую перегрузку Regex :: Replace, которая принимает Matchevaluator:

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

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

Оценщик также получает в качестве аргумента совпадающие группы, поэтому вы можете выполнить с ним некоторые расширенные замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...