2015-09-10 96 views
1

我有一个很长的配置文件,我需要从中抽取一个子字符串,编辑其中的一些内容,并替换原始内容并保存该文件。我对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

使用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 
+0

我已经编辑我原来的职位。我怀疑我没有正确理解这个实现,所以对此有所帮助。我尝试使用你提供的正则表达式,但是也没有产生任何结果。 –

+0

@MikeWhitehead看到我的编辑。 – briantist

+0

我试过了你的建议,但它什么都没有返回。 Get-Content将文件拉入,所以第一部分实际上是读取文件,但Select-String似乎无法找到匹配。例如,是否有任何方法来匹配[SECTION2]和[SECTION3]的开头方括号之间的所有内容? –

相关问题