gpt4 book ai didi

regex - 选择字符串结果上的 Powershell Select-Object 与 ForEach

转载 作者:行者123 更新时间:2023-12-03 14:20:12 24 4
gpt4 key购买 nike

假设我在变量 $mat 中调用 Select-String 的结果,从文件内容解析正则表达式:

$mat = cat errors.txt | Select-String "'(?<code>\w+)'.+ID (?<id>[^:]+)" 

根据 $mat | Get-Member 的输出结果包含类型为 Match[] 的 Matches 属性.

当我执行以下命令时,我得到了正则表达式输出的所有匹配项:
PS > $mat | Select-Object -Property Matches

Matches
-------
{'ACCFWD', ID 16}
{'EQASIAN', ID 448}

为什么使用 foreach 选择匹配项的下一个代码块没有相同的输出:
    PS > $mat | ForEach { $_.Matches } 


Groups : {'ACCFWD', ID 16, ACCFWD, 16}
Success : True
Captures : {'ACCFWD', ID 16}
Index : 20
Length : 15
Value : 'ACCFWD', ID 16

Groups : {'EQASIAN', ID 448, EQASIAN, 448}
Success : True
Captures : {'EQASIAN', ID 448}
Index : 20
Length : 17
Value : 'EQASIAN', ID 448

谢谢!

最佳答案

显示属性时,PowerShell 自动格式化没有在 *.format.ps1xml 中定义的显示格式的类型的属性。文件作为最多 4 个属性的表。 5 个或更多属性显示为列表。当您使用 Select-Object 选择匹配属性时,您正在选择 Microsoft.PowerShell.Commands.MatchInfo 的单个属性目的。与 Foreach-Object您正在显示 System.Text.RegularExpressions.Match 的所有属性目的。

使用 Select-Object -ExpandProperty Matches将导致输出看起来与 Foreach 相同因为它会输出 RegularExpressions.Match对象。

如果您放置 Get-Member在产生输出的两个示例之后,您将看到它们输出不同类型的对象。

编辑:这是对每个命令发生的格式的解释。

cat errors.txt | Select-String "'(?<code>\w+)'.+ID (?<id>[^:]+)"
Select-String 的输出是 Microsoft.PowerShell.Commands.MatchInfo具有 8 个属性的对象。这些属性默认不显示,因为 MatchInfo 的显示格式在 PowerShellCore.format.ps1xml 中定义显示 MatchInfo 的结果的 ToString()方法。
$mat | Select-Object -Property Matches

在这种情况下, Select-Object 的输出是自定义 Selected.Microsoft.PowerShell.Commands.MatchInfo带有 Matches 的对象从 MatchInfo 复制的属性目的。由于没有为 Selected.Microsoft.PowerShell.Commands.MatchInfo 定义默认显示格式类型,PowerShell 会自动将其格式化为表格,因为它的属性少于 5 个(在这种情况下, Matches 是唯一的属性)。
$mat | ForEach { $_.Matches } 

Foreach-Object脚本 block , Matches MatchInfo 的属性(property)正在输出对象。 Matches属性是 System.Text.RegularExpressions.Match它有6个属性。由于没有为 System.Text.RegularExpressions.Match 定义默认显示格式类型, Match对象显示为列表,因为有超过 4 个属性。

关于regex - 选择字符串结果上的 Powershell Select-Object 与 ForEach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7362798/

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