【问题标题】:Powershell - Replacing a string with a variable ending with a dollar signPowershell - 用以美元符号结尾的变量替换字符串
【发布时间】:2012-08-26 08:18:08
【问题描述】:

我对这个有点迷茫。无论出于何种原因,powershell 中的替换函数都不能很好地处理以 $ 符号结尾的变量。

命令:

$var='A#$A#$'
$line=('$var='+"'"+"'")
$line -replace '^.+$',('$line='+"'"+$var+"'")

预期输出:

$line='A#$A#$'

实际输出:

$line='A#$A#

【问题讨论】:

  • 这里还有其他事情 - 此代码有一个尾随 $ 并且工作正常:'$test$' -replace '^.+$', 'TEST$'
  • 看起来不仅仅是尾随的 $ 这就是问题所在。这是尾随的 $ 与 ' 组合形成特殊的 $' 正则表达式变量。 $' 代表比赛结束后的一切。由于您的正则表达式匹配整个字符串,因此匹配后没有任何内容,因此 $' 被任何内容替换。我正在尝试几种不同的转义方式来防止这种行为,但还没有找到正确的方法。
  • 更好的问题 - 你想做什么?坦率地说,这些线条看起来就像你不知道自己在做什么。
  • 你不会用以$结尾的东西替换。您正在替换以 $' 结尾的具有特殊含义的东西

标签: regex string powershell replace


【解决方案1】:

我不太明白你发帖的目的,在我看来,做$line='$line='''+$var+"'" 会更有意义,但如果你坚持自己的方式,那就做两个 替换调用,像这样:

$line -replace '^.+$',('$line=''LOL''') -replace 'LOL',$var

【讨论】:

    【解决方案2】:

    您似乎遇到了不想要的正则表达式替换。正则表达式特殊变量$' 代表匹配后的所有内容。由于您的正则表达式匹配整个字符串,$' 实际上是空的。在替换操作期间,.Net 正则表达式引擎会在您的预期输出中看到 $' 并替换为该空字符串。

    避免这种情况的一种方法是将$var 字符串中的所有$ 实例替换为$$

    $line -replace '^.+$',('$line='+"'"+($var.Replace('$','$$'))+"'")
    

    您可以在此处查看有关 .Net 中正则表达式替换的更多信息:

    Substitutions

    【讨论】:

    • 这不是一个解决方案,因为一旦您将 $var 更改为 $var='A#$A#$$' 之类的其他内容,您就会遇到同样的问题。 $var 是由用户输入定义的动态变量。它不是静态设置的。
    • 正如 manojlds 在他的评论中问的那样,你想做什么?我以为你在用一个抽象的例子来说明一个问题。将 $ 替换为 $$ 将避免该问题,无论您使用的是用户输入还是您自己定义的字符串。了解更多关于您的目标的信息,我们或许能够提出更好的解决方案。
    • 我正在创建一个安装程序脚本,用于在另一个 powershell 脚本中设置正确的变量。正在编辑的脚本将有一行像 $password='' 需要设置为工作,因此安装程序脚本将询问用户该变量的正确值并编辑目标脚本中的相应行。
    • 不,方法是正确的。所有替换特殊序列都以$ 开头,因此您只需使用$$ 转义任何文字$
    • 然而实现是不正确的——关键部分应该是$var -replace '\$','$$$$'或者更好的$var.Replace('$', '$$')。你怎么能忘记在这个答案中逃避$? :)
    【解决方案3】:

    通过将 $ 替换为特殊字符,然后在更改后将其恢复回来,我能够找到某种创可贴。最好选择一个键盘上没有键的字符。对我来说,我选择了“¤”。

    $var='A#$A#$'
    $var=$var -replace '\$','¤'
    $line=("`$var=''")
    $line -replace '^.+$',("`$line='$var'") -replace '¤','$'
    

    【讨论】:

      猜你喜欢
      • 2010-10-03
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-21
      • 2018-01-15
      相关资源
      最近更新 更多