Powershell通配符/正则表达式替换

时间:2017-02-24 14:27:02

标签: regex powershell nuget

我正在尝试编写PowerShell脚本来将我的.nuspec文件(nuget depdency)更新为最新的构建版本。我遇到了通配符问题。

所以我想替换这一行的版本号

<dependency id="MyCompany.Common" version="1.0.0.0" />

到新的版本号,即版本2.2.2.2

<dependency id="MyCompany.Common" version="2.2.2.2" />

我目前的地方法看起来像这样。注意我需要一个通配符,因为我需要替换的解决方案中有多个nuget包,所有都遵循MyCompany.PackageName的格式

$filecontent -replace 'id="MyCompany.*" version="*"', "$Version" | Out-File $file

但这实际上最终会创建

<dependency 2.2.2.21.0.0.0" />

如何修改我的正则表达式以确保它仅替换版本号组件?

3 个答案:

答案 0 :(得分:4)

替换为

$filecontent -replace 'id="MyCompany(.*?)" version=".*?"', "id=`"MyCompany`$1`" version=`"$Version`"" | Out-File $file

答案 1 :(得分:2)

我简单地使用了一个捕获组,所以我不会失去你的正则表达式的特异性,只匹配&#39; MyCompany。*&#39;在id中,但并没有增加很多复杂性。我将所有内容捕获到版本中的开头报价,并使用新版本号替换下一个报价之前的任何内容。

$test='<dependency id="MyCompany.Common" version="1.0.0.0" />'
$newVersion='2.2.2.2'
$test -replace "(id=`"MyCompany`..*`" version=)`"[^`"]*","`$1`"$newVersion"

<dependency id="MyCompany.Common" version="2.2.2.2" />

在PS 4.0

中测试过

Powershell奇怪和脆弱的部分包括:

  • 反向提示而不是\

  • 正则表达式必须是&#34;双引号&#34;

  • 必须使用单引号或转义符才能使捕获组在替换字符串中起作用

答案 2 :(得分:1)

$s = '<dependency id="MyCompany.Common" version="2.2.2.2" />'
$s -replace 'version=".*"', 'version="1.2.3.4"'<dependency id="MyCompany.Common" version="1.2.3.4" />