【问题标题】:How to replace $(data) in a string?如何替换字符串中的 $(data)?
【发布时间】:2020-08-12 19:27:38
【问题描述】:

我有一个名为 configuration.xml 的配置文件,它看起来像:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration xmlns="http://tempuri.org/Configuration.xsd">

  <Icons>
    <Icon name="about" file="$(data)\more\data\about.png" />
    <Icon name="help" file="$(data)\more\data\help.png" />
  </Icons>

</Configuration>

为了将这些配置文件部署到不同的环境,我想使用一个 powershell 脚本(当前为 PowerShell 5.1),它应该将 $(data) 替换为真实路径 - environment\path\to\data

我的脚本的简短版本如下所示:

$file = Get-Item '.\configuration.xml'
    
$content = ($file | Get-Content)

# file="$(data)\more\data" => file="environment\path\to\data\more\data"
$content = $content -replace '$(data)', 'environment\path\to\data'

$content | Set-Content $file.FullName

我尝试使用单引号转义$,还尝试使用反引号用双引号转义它 "`$(data)" 但这不起作用。

也尝试使用 unicode "$([char]0x0024)(data)" 解决它没有成功。

有人可以指点我的解决方案吗?


旁注
我想更改$(data),但它是第 3 方库的一部分,我无法更改。 3rd 方库使用$(data) 替换路径,此路径配置在另一个文件中。在大多数情况下,它使用完整路径,但在这个特定用例中,我必须为某些实例/子配置使用完整路径配置它。

【问题讨论】:

  • $content -replace '$(data)', 'environment\path\to\data' -> $content -replace [regex]::escape('$(data)'), 'environment\path\to\data'() 字符在正则表达式中具有特殊意义,也需要转义。正则表达式转义字符是\,这里必须使用它而不是PowerShell转义字符。
  • 您可能会发现学习ExpandString 很有用。这是一个内置工具,可以在某些定义的范围内插入 $variables 的值。

标签: powershell replace


【解决方案1】:

使用-replace 运算符时,正则表达式用于匹配字符串。正则表达式匹配的字符串被替换为文字字符串,但有一些例外。一般语法如下:

$strings -replace $regex,$stringliteral

正则表达式必须遵循正则表达式转义规则,而不是 PowerShell 转义规则。正则表达式转义字符是\。由于$() 是正则表达式中的特殊字符,因此您的正则表达式必须是\$\(data\)。这可以通过正则表达式Escape() 方法自动为您完成。

$file = Get-Item '.\configuration.xml'

$content = ($file | Get-Content)

$content = $content -replace [regex]::Escape('$(data)'), 'environment\path\to\data'

$content | Set-Content $file.FullName

【讨论】:

    猜你喜欢
    • 2022-01-03
    • 2023-04-09
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多