我正在尝试使用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 ... {...}
接下来,我看到捕获在matchs成员中,因此我将它们取出:
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
,但似乎返回的内容与上述相同。
我得到的最接近的是| 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
。
0
,它本身就是一个匹配项。因此,在您的案例Groups
集合中,有两个元素:匹配自身和第一个捕获组。如果只想捕获组,则必须通过指定Groups[1]
。