gpt4 book ai didi

regex - 如何从 Select-String 中获取捕获的组?

转载 作者:行者123 更新时间:2023-12-02 06:00:04 24 4
gpt4 key购买 nike

我正在尝试使用 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 ...

或作为列表 |格式列表:

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)给出相同的结果。

我想补充一点,经过进一步的尝试,似乎可以通过删除管道 | 来缩短命令。选择对象-属性组

最佳答案

看看下面的内容

$a = "http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$' 

$a 现在是一个 MatchInfo ($a.gettype()),它包含一个 Matches 属性.

PS ps:\> $a.Matches
Groups : {http://192.168.3.114:8080/compierews/, 192.168.3.114, compierews}
Success : True
Captures : {http://192.168.3.114:8080/compierews/}
Index : 0
Length : 37
Value : http://192.168.3.114:8080/compierews/

在群组成员中,您将找到您要查找的内容,以便您可以编写:

"http://192.168.3.114:8080/compierews/" | Select-String -Pattern '^http://(.*):8080/(.*)/$'  | % {"IP is $($_.matches.groups[1]) and path is $($_.matches.groups[2])"}

IP is 192.168.3.114 and path is compierews

关于regex - 如何从 Select-String 中获取捕获的组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33913878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com