我在 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} 每次我只想获取一个特定的字符串。
如果您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 将不显示任何内容或显示错误。
| 归档时间: |
|
| 查看次数: |
2817 次 |
| 最近记录: |