2011-09-16 25 views
3

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 

答えて

3

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

SelectSingleNodeは、最初のバージョン要素を選択します。次に、その内容を新しい内容に置き換えて、新しいファイルに保存します。具体的に置き換えたい場合は、内部コンテンツが6.1.26.p1であることのチェックを追加します。

+0

私はそれがXMLであることに気付かなかった。その場合、間違いなくこのようにします。 – EBGreen

4

それでは、あなたがTest.txtという名前のファイルがあったとしましょう、それが内容だったのです。

one 
two 
four 
four 
five 
six 
seven 
eight 
nine 
ten 

そして、あなたは代わりに3になるように4のちょうど最初のインスタンスを変更したい:

それがXMLの場合、XMLとしてそれを扱う
$re = [regex]'four' 
$re.Replace([string]::Join("`n", (gc C:\Path\To\test.txt)), 'three', 1) 
関連する問題