以下の行を含む testfile.txt という名前のテスト ファイルがあるとします。
one (two) "three"
PowerShell を使用して、文字列全体が存在する場合は、そのすぐ下に値を含む行を配置します。
four (five) "six"
(スペース、括弧、二重引用符の両方が含まれていることに注意してください。これは重要です。私が抱えている問題は、括弧と二重引用符をエスケープすることだと思うからです)。
したがって、結果は次のようになります。
one (two) "three"
four (five) "six"
一番簡単な方法は、最初の文字列が見つかったら、それを最初の文字列自体に置き換えて、同じコマンドに新しい行を形成する新しい文字列を含めることだと思いました。文字列を一列に並べるのに苦労したので、書式付きのテキスト ブロック全体を読み取るヒアストリング変数を使用してみました。引用符で囲まれた完全な文字列をパイプラインに解析しません。私はpowershellを初めて使用するので、ばかげたことを見つけても遠慮しないでください。
$herestring1 = @"
one (two) "three"
"@
$herestring2 = @"
one (two) "three"
four (five) "six"
"@
if((Get-Content testfile.txt) | select-string $herestring1) {
"Match found - replacing string"
(Get-Content testfile.txt) | ForEach-Object { $_ -replace $herestring1,$herestring2 } | Set-Content ./testfile.txt
"Replaced string successfully"
}
else {
"No match found"}
上記は、毎回「一致が見つかりません」と表示するだけです。これは、ファイル内の最初の文字列が見つからないためです。バックティック [ ` ] と二重引用符を使用してエスケープを試みましたが、ヒア文字列のポイントは、すべての書式設定を含むテキスト ブロックを解析する必要があるため、解析する必要はないと考えました。
ファイルのみを含むように変更した場合:
one two three
それに応じてヒアストリングを次のように変更します。
$herestring1 = @"
one two three
"@
$herestring2 = @"
one two three
four five six
"@
その後、問題なく動作し、必要に応じて文字列を置き換えます。