我有一个很长的配置文件,我需要从中提取子字符串,编辑其中的一些内容,并替换原始内容并保存文件。我是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})'
我做了一些根本错误的事情吗?
答案 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\]([^\[]+)
该模式会查找[SECTION2]
字符串,然后捕获包含一个或多个不是[
的字符的组。
您也可以使用命名的捕获组:
$matchObjects = Get-Content 'PATH_TO_FILE' -Raw | Select-String -Pattern '(?s)\[SECTION2\](?<Content>[^\[]+)'
$contents = $matchObjects[0].Groups['Content'].Value