【问题标题】:Using Regex to replace multiple lines of text in file使用正则表达式替换文件中的多行文本
【发布时间】:2020-04-03 18:29:53
【问题描述】:

基本上,我有一个要更新的 .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

问题在于它没有替换文本块。我可以让它替换其中的任何一个,但我不能让它拉入两者之间的所有内容。

有人对我如何做到这一点有任何想法吗?

【问题讨论】:

  • 读取文件时需要使用-Raw"(?s)&lt;BEGINREPLACEMENT&gt;.*?&lt;ENDREPLACEMENT&gt;" 正则表达式。另外,在动态替换中使用逃生美元$temp -replace $regex, $update.Replace('$', '$$')
  • 是的,就是这样(以 -Raw 形式读取并更新正则表达式)!我不确定为什么正则表达式需要有所不同,尽管我没有在两个标签之间寻找任何东西?
  • . 默认不匹配换行符。
  • 知道了。好吧,这完全解决了我的问题。非常感谢!

标签: regex windows powershell scripting


【解决方案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('$', '$$')

【讨论】:

    猜你喜欢
    • 2015-07-27
    • 2017-10-18
    • 2014-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多