web-dev-qa-db-ja.com

PowerShell:引用-置換と変数

これは私の前の質問への回答です:

PowerShell:-replace、regex and($)dollar sign woes

私の質問は、次の2行のコードで出力が異なるのはなぜですか。

'abc' -replace 'a(\w)', '$1'
'abc' -replace 'a(\w)', "$1"

そして、以下の2つの記事によると、単一引用符で囲まれた変数「$ 1」がリテラル文字列として使用されないのはなぜですか?一重引用符で囲まれたものはすべて、リテラルテキスト文字列として処理する必要があります。

http://www.computerperformance.co.uk/powershell/powershell_quotes.htm
http://blogs.msdn.com/b/powershell/archive/2006/07/15/variable-expansion-in-strings-and-herestrings.aspx

17
Vippy

一重引用符を使用する場合、PowerShellに文字列リテラルを使用するように指示します。これは、開始引用符と終了引用符の間のすべてが文字どおりに解釈されることを意味します。

二重引用符を使用すると、PowerShellは二重引用符内の特定の文字を解釈します。

_get-help about_quoting_rules_を参照するか、 ここ をクリックします。

ドル記号は、正規表現とPowerShellで特別な意味を持っています。ドル記号を正規表現として使用する場合は、一重引用符を使用します。

あなたの例では、正規表現a(\w)が文字 'a'に一致し、後方参照#1でキャプチャされたWord文字に一致しています。したがって、_$1_に置き換えると、一致したテキストabを後方参照一致bに置き換えます。つまり、bcを取得します。

二重引用符を使用する2番目の例では、PowerShellは_"$1"_を変数_$1_が内部にある文字列として解釈します。 _$1_という名前の変数がないため、nullです。したがって、正規表現はabをnullに置き換えました。これがcのみを取得する理由です。

20
Andy Arismendi

2行目:

'abc' -replace 'a(\ w)'、 "$ 1"

他の人が述べたように、Powershellは正規表現の置換操作に到達する前に$ 1を置換します。次のようにバックティックを使用することで、この置換を回避できます。

'abc' -replace 'a(\ w)'、 "` $ 1 "

したがって、置換$ stringに含めたい変数$ prefixに文字列がある場合、次のようにそれを二重引用符で使用できます。

'abc' -replace 'a(\ w)'、 "$ prefix` $ 1"

16
David Rogers

'$ 1'は正規表現の後方参照です。正規表現の一致によって作成され、その置換操作のコンテキスト内にのみ存在します。 PowerShell変数ではありません。

「$ 1」は、Powershell変数として解釈されます。 $ 1という変数が存在しない場合、置換値はnullになります。

4
mjolinor

コメントも賛成投票もできないので、David Rogersの答えがうまくいきました。 RexEx置換では、RegExバックリファレンスとPowershell変数の両方を使用する必要がありました。

実装する前に、バックティックが何をしたかを理解する必要がありました。ここに説明があります。バックティックはPowershellのエスケープ文字です。

私のユースケース

$new = "AAA"
"REPORT.TEST998.TXT" -Replace '^([^.]+)\.([^.]+)([^.]{3})\.', "`$1.`$2$new."

結果

REPORT.TESTAAA.TXT

代替案

フォーマット文字列

"REPORT.TEST998.TXT" -Replace '^([^.]+)\.([^.]+)([^.]{3})\.', ('$1.$2{0}.' -f )

コメント

https://get-powershellblog.blogspot.com/2017/07/bye-bye-backtick-natural-line.html の使用を避けるために、おそらくフォーマット文字列メソッドを使用しますバックティック。

1
MickMorley