在 PowerShell 中合并两个正则表达式
Combine two regex in PowerShell
这是我要解析的数据:
10.186.128.0/20 172.17.128.161 0 65000 8788
10.186.128.0/20 172.17.128.161 0 65000 878
10.186.128.0/20 172.17.128.161 0 65000 87
理想情况下,输出应与行首的 IP 地址以及最后 2、3 或 4 位数字相匹配。
所需输出示例:
10.186.128.0/20 8788
10.186.128.0/20 878
10.186.128.0/20 87
我有匹配 IP 地址的正则表达式 "10\.\d*\.\d*\.\d*\/\d\d"
然后我有第二个正则表达式,它将匹配最后 2 或 3 或 4 位数字 " \d{4}$| \d{3}$| \d{2}$"
问题是如何在 PowerShell 中组合这两个正则表达式以获得预期的结果?
谢谢
您可以使用
Get-Content $filepath | Select-String '^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$' -AllMatches | Foreach-Object {$_.Matches} | Foreach-Object {$_.Groups[1].Value + " " + $_.Groups[2].Value}
^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$
正则表达式 - 参见 its online demo - 匹配:
^
- 字符串开头
(10(?:\.\d+){3}/\d+)
- 第 1 组:10
,然后重复三个点和任意 1+ 位数字,然后是 /
和 1+ 位数字
\s.*\s
- 一个空格,除换行符以外的任何 0+ 个字符,以及一个空格
(\d+)
- 第 2 组:1+ 位数
$
- 字符串结尾。
所以,
Get-Content $filepath
读取文件
Select-String '^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$' -AllMatches
通过逐行读取文件从文件中获取所有匹配项
Foreach-Object {$_.Matches}
一个接一个抓取所有匹配项
Foreach-Object {$_.Groups[1].Value + " " + $_.Groups[2].Value}
连接第 1 组和第 2 组值。
如果您的所有数据始终采用发布的格式,使用 -split
似乎要简单得多。
Get-Content -Path file.txt |
Foreach-Object { [string]($_ -split ' ')[0,-1] }
解释:
-split
使用正则表达式匹配将字符串拆分为字符串数组。这里字符串是根据单个 space 拆分的。 [0,-1]
选择数组的第一个(索引 0)和最后一个(索引 -1)元素。
[string]
将两个数组元素转换为字符串。由于 PowerShell 在将两个项目转换为字符串时自动将它们与 space 连接起来,因此这只是一个快捷方式。
如果只需要一种快速修改字符串的方法
用这两个正则表达式之一简单替换:
$string -replace '(?<=\b10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}\b)', ''
或
$string -replace '(?m)(?<=^[ \t]*10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}[ \t]*$)', ''
这是我要解析的数据:
10.186.128.0/20 172.17.128.161 0 65000 8788
10.186.128.0/20 172.17.128.161 0 65000 878
10.186.128.0/20 172.17.128.161 0 65000 87
理想情况下,输出应与行首的 IP 地址以及最后 2、3 或 4 位数字相匹配。 所需输出示例:
10.186.128.0/20 8788
10.186.128.0/20 878
10.186.128.0/20 87
我有匹配 IP 地址的正则表达式 "10\.\d*\.\d*\.\d*\/\d\d"
然后我有第二个正则表达式,它将匹配最后 2 或 3 或 4 位数字 " \d{4}$| \d{3}$| \d{2}$"
问题是如何在 PowerShell 中组合这两个正则表达式以获得预期的结果?
谢谢
您可以使用
Get-Content $filepath | Select-String '^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$' -AllMatches | Foreach-Object {$_.Matches} | Foreach-Object {$_.Groups[1].Value + " " + $_.Groups[2].Value}
^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$
正则表达式 - 参见 its online demo - 匹配:
^
- 字符串开头(10(?:\.\d+){3}/\d+)
- 第 1 组:10
,然后重复三个点和任意 1+ 位数字,然后是/
和 1+ 位数字\s.*\s
- 一个空格,除换行符以外的任何 0+ 个字符,以及一个空格(\d+)
- 第 2 组:1+ 位数$
- 字符串结尾。
所以,
Get-Content $filepath
读取文件Select-String '^(10(?:\.\d+){3}/\d+)\s.*\s(\d+)$' -AllMatches
通过逐行读取文件从文件中获取所有匹配项Foreach-Object {$_.Matches}
一个接一个抓取所有匹配项Foreach-Object {$_.Groups[1].Value + " " + $_.Groups[2].Value}
连接第 1 组和第 2 组值。
如果您的所有数据始终采用发布的格式,使用 -split
似乎要简单得多。
Get-Content -Path file.txt |
Foreach-Object { [string]($_ -split ' ')[0,-1] }
解释:
-split
使用正则表达式匹配将字符串拆分为字符串数组。这里字符串是根据单个 space 拆分的。 [0,-1]
选择数组的第一个(索引 0)和最后一个(索引 -1)元素。
[string]
将两个数组元素转换为字符串。由于 PowerShell 在将两个项目转换为字符串时自动将它们与 space 连接起来,因此这只是一个快捷方式。
如果只需要一种快速修改字符串的方法
用这两个正则表达式之一简单替换:
$string -replace '(?<=\b10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}\b)', ''
或
$string -replace '(?m)(?<=^[ \t]*10\.\d{0,3}\.\d{0,3}\.\d{0,3}/\d{2}).*(?=[ \t]\d{1,4}[ \t]*$)', ''