繁体   English   中英

Powershell正则表达式用于两个字符之间的多行子字符串

[英]Powershell Regex for substring over multi-line between two characters

我有一个长配置文件,需要从中提取子字符串,在其中编辑一些内容,然后替换原始内容并保存文件。 我对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})'

我是从根本上做错了吗?

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\]([^\[]+)

正则表达式可视化

Debuggex演示

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

您还可以使用命名捕获组:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM