【问题标题】:Unable to edit/replace string value with plus symbol "+" in text file via PowerShell无法通过 PowerShell 在文本文件中用加号“+”编辑/替换字符串值
【发布时间】:2018-01-26 06:23:37
【问题描述】:

我正在尝试更新一组基于 XML 的 .config 文件。文件中有一个字符串包含我无法用我的脚本替换的加号:

< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />

如果我包含加号,脚本什么也不做。由于所有配置都不同,我需要替换文本 - 不能只使用新文件。

想要的结果是文件中的匹配值被替换为指定的值,但+ 符号不允许这样做。这是我的 PS 脚本:

$DIRs = Get-ChildItem -Path "C:\TEST" -Directory 
Get-ChildItem $DIRs -File -Recurse -Filter *.config | 
    ForEach { (Get-Content $_.FullName) | 
    ForEach { $_ -replace '< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />','< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />' } | 
    Set-Content $_.FullName }

作为测试,我将所有文本替换为加号,它工作正常,但加号和后续出现在新文本的末尾,因为我已将“+nopqrst”从脚本中删除。

在 PSv3 上运行,仅供参考。

【问题讨论】:

  • 在加号前试试反斜杠
  • &lt; foo=bar= /&gt; 是无效的 XML。你的数据真的像这样吗?否则使用 XML 解析器可能是更合适的方法。
  • @AnsgarWiechers - 不,我的 XML 是正常的,这只是一个删除所有信息的快速表示。

标签: windows powershell replace special-characters


【解决方案1】:

-replace 运算符使用正则表达式作为第一个后缀参数来定义搜索模式。在正则表达式中,某些字符具有special meaning+ 特别是一个所谓的“量词”,意思是“前面(子)表达式的一个或多个倍”。为了替换文字特殊字符,您需要对它们进行转义。

还好有内置的method for escaping strings

$_ -replace [RegEx]::Escape('< SharedPassKey=123456789abcdefghi/JKLM+nopqrst= />'),'< SharedPassKey=123456789abcdefghi/JKLM.nopqrst= />'

【讨论】:

  • 但请注意,[regex]::Escape() 将转义给定字符串中的所有特殊字符。如果您只想将一个文字(子)字符串替换为另一个,您可能需要考虑使用String.Replace() 方法:$_.Replace('foo', 'bar')
  • 两者都非常有帮助! @Ansgar,感谢您的提示,我没有使用过该方法,但将来不会回避。
  • @Bacon Bits 为我解决了这个问题!他对我的剧本的调整被证明是成功的。谢谢!
【解决方案2】:

如果您有有效的 XML 数据,并且想要修改 XML 文件中节点属性的值,您可能需要考虑使用适当的 XML 解析器,如下所示:

$xmlfile = 'C:\path\to\your.config'

[xml]$xml = Get-Content $xmlfile
$attr = $xml.SelectSingleNode('//somenode/@SharedPassKey')
$attr.'#text' = $attr.'#text'.Replace('+', '.')

$xml.Save($xmlfile)

使用于选择属性的XPath expression 尽可能具体。这将允许您在该属性中将 + 替换为 .

【讨论】:

  • 嗨 Ansgar,我已经用 -replace 做了很长时间了,但最后一个特殊字符阻止了我。我不熟悉您提供的方法,并且您留下的示例似乎不会涵盖子目录中的多个文件。我也不知道如何指定要使用此方法编辑的字符串。显然,我不期待上课,我现在正在做自己的研究/学习,但是,非常感谢您的意见和以前的 cmets。如果我能学会这种方法,它可能会更有效。
  • 该代码只是一个如何使用 XML 解析器替换属性值的示例。它并不意味着是一个交钥匙解决方案。此外,使用这种方法,您无需指定单个字符串。您有一个 XPath 表达式,用于选择要更改其值的属性,以及该值的替换操作。
猜你喜欢
  • 2022-07-12
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2018-05-11
相关资源
最近更新 更多