我正在尝试使用 Powershell(版本 4)从 Windows 上的一组文件中提取文本:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | Format-Table
到目前为止,一切都很好。这给出了一组很好的MatchInfo
对象:
IgnoreCase LineNumber Line Filename Pattern Matches
---------- ---------- ---- -------- ------- -------
True 30 ... file.jsp ... {...}
接下来,我看到捕获在matches 成员中,所以我将它们取出:
PS > Select-String -AllMatches -Pattern <mypattern-with(capture)> -Path file.jsp | ForEach-Object -MemberName Matches | Format-Table
这使:
Groups Success Captures Index Length Value
------ ------- -------- ----- ------ -----
{...} True {...} 49 47 ...
或作为列表| Format-List
:
Groups : {matched text, captured group}
Success : True
Captures : {matched text}
Index : 39
Length : 33
Value : matched text
这就是我停下来的地方,我不知道如何进一步获取捕获的组元素列表。
我试过添加另一个| ForEach-Object -MemberName Groups
,但它似乎返回与上面相同。
我得到的最接近的是 with | Select-Object -Property Groups
,这确实给了我我所期望的(一组列表):
Groups
------
{matched text, captured group}
{matched text, captured group}
...
但是后来我无法从每个组中提取捕获的组,我尝试| Select-Object -Index 1
只得到其中一组。
更新:一个可能的解决方案
似乎通过添加| ForEach-Object { $_.Groups.Groups[1].Value }
我得到了我想要的东西,但我不明白为什么 - 所以我不能确定在将这种方法扩展到整套文件时我是否能够得到正确的结果。
为什么它有效?
作为旁注,这| ForEach-Object { $_.Groups[1].Value }
(即没有第二个.Groups
)给出了相同的结果。
我想补充一点,在进一步尝试后,似乎可以通过删除 piped 来缩短命令| Select-Object -Property Groups
。