获取字符串的更短语法?[选择字符串]

Vas*_*kis 4 powershell

我在 Powershell 中使用 Select-String 进行了很多正则表达式匹配。

例如,最简单也可能是最常见的匹配,IPv4 地址:

$regex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b
Run Code Online (Sandbox Code Playgroud)

现在,如果我将其匹配到一行中:

$输出=`

“等等,202.100.100.9,你要匹配这一行中间的 IP,

但不在这一行,因为“2.a.3.one”不是有效的 IPv4 地址”

然后我这样做:

$output | Select-String $regex
Run Code Online (Sandbox Code Playgroud)

它会给我整条线。

我不能真正以原始形式使用它。

但是如果我使用这个:

$output | Select-String $regex | %{$_.Matches} | %{$_.Value}
Run Code Online (Sandbox Code Playgroud)

它只会给我 IP 地址,这很棒。

我的问题是:

有没有更简单的方法来做到这一点?

我宁愿不输入 | %{$ .匹配} | %{$ .Value} 每次我只想获取一个特定的字符串。

Jas*_*irk 7

如果您Select-String更喜欢-replace运算符(这只是调用的语法糖[Regex]::Replace),PowerShell V3 有一些快捷方式可以节省一些输入。

Select-String首先, =>有一个别名sls。其次,使用简单的 foreach-object 脚本块,您可以仅用属性替换脚本块。

结合这些,您可以使用

$output | sls $regex | % Matches | % Value
Run Code Online (Sandbox Code Playgroud)

为了节省更多的输入,PowerShell 可以选项卡完整的匹配项,但不能选项卡值。

另一个更少输入的选项是使用属性语法:

($output | sls $regex).Matches.Value
Run Code Online (Sandbox Code Playgroud)

作为奖励,选项卡完成可以完成本例中的匹配和值。请注意,第二个示例在 V2 中有效,但前提是只有一个匹配行。如果有多个匹配行,则只有在 V3 中才能看到所有结果,如果启用严格模式,V2 将不显示任何内容或显示错误。