0

正規表現を使用して、ファイル内のテキストを照合および置換しようとしています。キャプチャ グループも使用しています。置換テキストでは、展開したいキャプチャ グループとその他の変数を使用しています。問題は、他の変数の値が数字で始まると、それらが展開され、存在しないキャプチャされたグループとして展開しようとしていると思います。

差し替え前の文章はこちら

merchantId="101"

Read-Host コマンドの入力として 101 を使用して置き換えた後のテキストを次に示します。

$1101"

そして、これを使用してテキストを一致させて置き換えます

$merchant = Read-Host 'What merchant would you like to use?'
$configPath = '..\src\config.cfg'

(Get-Content $configPath) | ForEach-Object {
    $_ -replace "(merchantId="").*("")\s*$", "`$1$merchant`$2"
}

マーチャントは常に数字なので、ユーザーがマーチャントに 101 のようなものを入力すると、置換テキストは $1101 に拡張されているように見えるため、powershell はもちろん存在しない 1101 番目のキャプチャされたグループを探していると思います。

私はpowerhsellを初めて使用し、構文が少し奇妙で、どうすればよいかわかりません。

4

1 に答える 1

1

あなたの仮定は正しいです。PowerShell または正規表現エンジンに問題があるかどうかはわかりませんが、存在しないキャプチャ グループを見つけようとしています。その場合、文字列リテラルが返されます。アルファベット順であれば、$merchantこの問題は発生しません。

簡単な解決策は、PetSerAlが提供するものです。これにより、変数とキャプチャ グループが区別されます。

$_ -replace "(merchantId="").*("")\s*$", "`${1}$merchant`$2"

しかし、あなたは本当にあなたがそうしている必要はありません。値を完全に置き換えているだけで、以前の値は気にしないので、完全に上書きしないのはなぜですか?

(Get-Content $configPath) | ForEach-Object {
    If($_ -match "^merchantId="){
        'merchantId="{0}"' -f $merchant
    } else {
        $_
    }
}

最も美しいコードではありませんが、機能します。

于 2015-09-09T15:34:03.140 に答える