如何连接正则表达式匹配项和不带空格或其他字符的字符串变量?

时间:2018-10-12 08:44:39

标签: powershell

我想用Powershell文件中的正则表达式替换日期。所有白色间距都必须保留:

#define    BUILD_DATE          20181010

当前日期是一个变量:

[string]$Today = Get-Date -UFormat "%Y%m%d"

我学会了在替换表达式中使用匹配项时使用反引号:

(Get-Content $ItemFullPath) |
Foreach-Object { $_ -replace "(#define\s+?BUILD_DATE\s+?)\S+", "`$1$Today" } |
Set-Content $ItemFullPath

但这导致:

#define    BUILD_DATE          $Today

我不能在此处添加另一个空格字符。该文件的其他读者和作者都希望存在相同的空格。

2 个答案:

答案 0 :(得分:1)

使用大括号,以使PowerShell和regex引擎不会混淆一个变量/反向引用在哪里结束而另一个在哪里开始。另外,这里不需要ForEach-Object,因为-replace运算符用作枚举器,因此可以直接在数组上使用。

(Get-Content $ItemFullPath) -replace "(#define\s+?BUILD_DATE\s+?)\S+", "`${1}$Today" } |
    Set-Content $ItemFullPath

答案 1 :(得分:1)

使用RegEx和非消耗性look behind断言,
没有理由在替换中引用捕获组。

此脚本使用其自身的源代码更新日期。

## Q:\Test\2018\10\12\SO_52775631.ps1

#define    BUILD_DATE          20181010

$ItemFullPath = $MyInvocation.MyCommand.Name

[string]$Today = Get-Date -UFormat "%Y%m%d"

(Get-Content $ItemFullPath) -replace "(?<=#define\s+?BUILD_DATE\s+?)\d{8}", $Today |
Set-Content $ItemFullPath