使用正则表达式替换文件中的多行文本

时间:2019-12-10 14:27:12

标签: regex windows powershell scripting

基本上,我有一个要更新的.bas文件。基本上,脚本需要一些手动配置,我不希望我的团队在每次运行脚本时都需要重新配置脚本。我想做的就是有一个这样的标签

<BEGINREPLACEMENT>
'MsgBox ("Loaded")


ReDim Preserve STIGArray(i - 1)
ReDim Preserve SVID(i - 1)

STIGArray = RemoveDupes(STIGArray)
SVID = RemoveDupes(SVID)
<ENDREPLACEMENT>

我对powershell有点熟悉,所以我想做的就是创建一个更新文件,并用更新替换标签之间的内容。我想做的是:

$temp = Get-Content C:\Temp\file.bas
$update = Get-Content C:\Temp\update
$regex = "<BEGINREPLACEMENT>(.*?)<ENDREPLACEMENT>"

$temp -replace $regex, $update
$temp | Out-File C:\Temp\file.bas

问题在于它不会替换文本块。我可以用它代替它,或者也不能在两者之间插入所有东西。

有人对我该怎么做有想法吗?

1 个答案:

答案 0 :(得分:1)

您需要确保以换行符读取整个文件,这可以通过将-Raw选项传递给Get-Content来实现。

然后,.默认不与换行符匹配,因此您需要使用(?s)内联DOTALL(或“单行”)选项。

此外,如果您的动态内容包含类似$2之类的内容,则可能会遇到异常,因为这是对模式2的第二组的反向引用。您需要通过将其中的每个$加倍来处理替换字符串。

$temp = Get-Content C:\Temp\file.bas -Raw
$update = Get-Content C:\Temp\update -Raw
$regex = "(?s)<BEGINREPLACEMENT>.*?<ENDREPLACEMENT>"
$temp -replace $regex, $update.Replace('$', '$$')