PowerShell:Quoting -replace&变量

时间:2012-02-23 22:48:30

标签: variables powershell replace quotes

这是对我之前的问题的回应:

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

我的问题是:为什么这两行代码有不同的输出:

'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

5 个答案:

答案 0 :(得分:19)

当您使用单引号时,您告诉PowerShell使用字符串文字,这意味着开头和结尾引号之间的所有内容都应按字面解释。

当您使用双引号时,PowerShell将解释双引号内的特定字符。

请参阅get-help about_quoting_rules或点击here

美元符号在正则表达式和PowerShell中具有特殊含义。如果您打算将美元符号用作正则表达式,则需要使用单引号。

在您的示例中,正则表达式a(\w)与字母“a”匹配。然后在后面的参考文献#1中捕获一个单词字符。因此,当您使用$1替换时,您正在使用后引用匹配ab替换匹配的文本b。所以你得到bc

在使用双引号的第二个示例中,PowerShell将"$1"解释为内部带有变量$1的字符串。您没有名为$1的变量,因此它为空。所以正则表达式将ab替换为null,这就是为什么你只得到c

答案 1 :(得分:14)

在你的第二行:

  

'abc'-replace''(\ w)',“$ 1”

正如其他人所说,Powershell在进入正则表达式替换操作之前替换了1美元。您可以使用反引号来避免替换,如:

  

'abc'-replace''(\ w)',“`$ 1”

因此,如果你想在替换字符串中包含一个变量$前缀中的字符串,你可以在双引号中使用它,如下所示:

  

'abc'-replace''(\ w)',“$ prefix` $ 1”

答案 2 :(得分:4)

'$ 1'是一个正则表达式反向引用。它由正则表达式匹配创建,并且仅存在于该替换操作的上下文中。它不是powershell变量。

“$ 1”将被解释为Powershell变量。如果不存在名为$ 1的变量,则替换值将为null。

答案 3 :(得分:0)

由于我无法发表评论或投票,大卫·罗杰斯(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,我可能会使用格式字符串方法来避免使用反引号。

答案 4 :(得分:0)

这是 powershell 7 版本,您不必处理单引号 $1,将脚本块作为第二个参数,将 'ab' 替换为 'b':

'abc' -replace 'a(\w)', {$_.groups[1]}

bc