Заменить первое вхождение строки в файле - PullRequest
3 голосов
/ 16 сентября 2011

В сценарии PowerShell, чтобы заменить первое вхождение строки в файле, я пришел с приведенным ниже кодом, который отслеживает в переменной, была ли произведена замена.

Есть ли более элегантный (идиоматический) способ сделать это?

$original_file = 'pom.xml'
$destination_file =  'pom.xml.new'

$done = $false
(Get-Content $original_file) | Foreach-Object {
    $done
    if ($done) {
        $_
    } else {
        $result = $_ -replace '<version>6.1.26.p1</version>', '<version>6.1.26.p1-SNAPSHOT</version>'
        if ($result -ne $_) {
            $done = $true
        }
        $result
    }
} | Set-Content $destination_file

Ответы [ 2 ]

5 голосов
/ 16 сентября 2011

Итак, предположим, что у вас есть файл с именем Test.txt, и его содержимое было:

one
two
four
four
five
six
seven
eight
nine
ten

И вы хотите вместо этого изменить только первый экземпляр из четырех на три:

$re = [regex]'four'
$re.Replace([string]::Join("`n", (gc C:\Path\To\test.txt)), 'three', 1)
3 голосов
/ 16 сентября 2011

Если это xml, обработайте его как xml:

$xml = [xml](gc $original_file)
$xml.SelectSingleNode("//version")."#text" = "6.1.26.p1-SNAPSHOT"
$xml.Save($destination_file)

SelectSingleNode выберет первый элемент версии. Затем замените его внутреннее содержимое и сохраните в новый файл. Добавьте проверку на наличие внутреннего содержимого 6.1.26.p1, если хотите специально заменить только это.

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