我想在Powershell的文件中用正则表达式替换日期。所有whitespacing都需要保留:
#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
我不能在这里添加另一个空格字符。该文件的其他读者和编写者期望存在相同的空白。
使用大括号,以便PowerShell和正则表达式引擎不会混淆一个变量/反向引用结束而另一个开始的位置。此外,这里不需要ForEach-Object
,因为-replace
运算符作为枚举器工作,因此可以直接在数组上使用。
(Get-Content $ItemFullPath) -replace "(#define\s+?BUILD_DATE\s+?)\S+", "`${1}$Today" } |
Set-Content $ItemFullPath
使用带有非消耗look behind断言的RegEx, 没有理由在替换中引用捕获组。
此脚本使用自己的源代码更新日期。
## 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