Powershell Regex用于两个字符之间的多行子串

时间:2015-09-10 20:09:56

标签: regex powershell

我有一个很长的配置文件,我需要从中提取子字符串,编辑其中的一些内容,并替换原始内容并保存文件。我是PowerShell的新手,但我认为我能做的最后两部分。我遇到的问题是首先使用正则表达式匹配。

[SECTION1]
SETTING1=ABC
SETTING2=DEF
SETTING3=GHI
[SECTION2]
SETTING1=ABC
ANOTHERSETTING=XYZ
[SECTION3]
SOMESETTING=DFH
FINALSETTING=OWA

我已经在RegExr上测试了一个正则表达式,它在那里运行正常,但是在尝试将其传输到PowerShell脚本时我没有任何乐趣。

(^\[SECTION2\](\n.+$){2})

我想做的是找到“[SECTION2]”,并将所有内容匹配到“[”的下一个实例。我目前有匹配“[SECTION2]”和两个换行符,但想要匹配到下一个方括号。

我已经尝试了几个命令来运行正则表达式,但似乎什么都没有给我带回任何东西。例如:

Select-String -Path 'PATH_TO_FILE' -Pattern '(^\[SECTION2\](\n.+$){2})'

我做了一些根本错误的事情吗?

1 个答案:

答案 0 :(得分:1)

Select-String与文件一起使用将分别针对每一行运行模式,但您需要将整个文件作为一个大字符串进行匹配。

该模式也存在问题。

尝试这样的事情:

$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\]([^\[]+)'
$contents = $matchObjects[0].Groups[1].Value

-Raw部分是Get-Content读取整个文件内容而不是逐行读取的部分,它需要PowerShell 3 +。

\[SECTION2\]([^\[]+)

Regular expression visualization

Debuggex Demo

该模式会查找[SECTION2]字符串,然后捕获包含一个或多个不是[的字符的组。

您也可以使用命名的捕获组:

$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\](?<Content>[^\[]+)'
$contents = $matchObjects[0].Groups['Content'].Value