2

以下の行を含む 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
"@

その後、問題なく動作し、必要に応じて文字列を置き換えます。

4

2 に答える 2

1

Martin が指摘しているように、 with を使用-SimpleMatchSelect-Stringて、正規表現として解析することを回避できます。

しかし、-replaceまだ正規表現を使用しています。

次を使用して正規表現のパターンをエスケープできます[RegEx]::Escape()

$herestring1 = @"
one (two) "three"
"@

$herestring2 = @"
one (two) "three"
four (five) "six"
"@

$pattern1 = [RegEx]::Escape($herestring1)

if((Get-Content testfile.txt) | select-string $pattern1) {
"Match found - replacing string"
(Get-Content testfile.txt) | ForEach-Object { $_ -replace $pattern1,$herestring2 } | Set-Content ./testfile.txt
"Replaced string successfully"
}
else {
"No match found"}

正規表現は、括弧()(括弧と呼んでいるもの) を特別なものとして解釈します。デフォルトでは、スペースは特別なものではありませんが、特定の正規表現オプションで使用できます。二重引用符は問題ありません。

正規表現では、エスケープ文字は backslash\であり、これは backtick を使用して PowerShell パーサーに対して行うエスケープとは無関係です`

[RegEx]::Escape()正規表現パターンがそれをリテラルとして解釈するように、正規表現に特別なものがエスケープされるようにするため、パターンは次のようになります。one\ \(two\)\ "three"

于 2016-10-17T14:46:38.547 に答える