我想用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
我不能在此处添加另一个空格字符。该文件的其他读者和作者都希望存在相同的空格。
答案 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