我把这个输出写到一个文本文件中:
DataStore_Checksum.txt:65:esentutl : ERROR: page 3401 checksum failed
DataStore_Checksum.txt:69: + CategoryInfo : NotSpecified: (ERROR: page 3401 checksum failed:String) [], RemoteException
DataStore_Checksum.txt:73:ERROR: page 6131 checksum failed
DataStore_Checksum.txt:74:ERROR: page 6357 checksum failed
我需要存储校验和失败的每个页码。在这种情况下,[3401, 6131, 6357]
.
我尝试使用两种方式:
ToString().Split(' ')[2]
'd pattern matches
但是页码的行内容位置在每行上都不同。由于某种原因,d
语法不适用于Select-String
或-Split
。
有什么想法吗?
为了用一个更简洁的替代方案来补充 Mathias R. Jessen 的有用答案,假设将整个输入文件加载到内存中是可以接受的:
[regex]::Matches((Get-Content -Raw file.txt), '(?<=bERROR: page )d+').Value
[regex]::Matches()
查找指定正则表达式的输入字符串中的所有匹配项。否定后备断言
(?<=bERROR: page )
查找字符串ERROR: page
而不将其包含在每个匹配项中,因此匹配项仅包含页码 (d+
(。访问所有匹配项的
.Value
属性,则仅返回一个页码数组(字符串形式(。
上面生成了一个常规的PowerShell数组([object[]]
(,其中包含所有页码:
3401
3401
6131
6357
如果需要消除重复项:
如果重复项始终组合在一起,请将上面的命令通过管道传送到
| Get-Unique
如果它们未分组,请通过管道连接到
| Select-Object -Unique
。如果您想在消除重复项的同时按页码排序,请按照 Mathias 的答案
| Sort-Object -Unique
管道。
模式d
是一个语法上有效的正则表达式,并且可以与Select-String
一起使用,但由于您想要的数字总是被相同的文本模式包围,即:
ERROR: page #NUMBER# checksum failed
在这种情况下,使用Select-String
捕获所有连续数字可能会更好:
$pageNumbers = Select-String 'ERROR: page (d+) checksum failed' -Path .file.txt -AllMatches |ForEach-Object {
# grab the (d+) capture group
$_.Match.Groups[1].Value
} |Sort-Object -Unique # filter out duplicates