在变量上存储不同的位置编号



我把这个输出写到一个文本文件中:

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

最新更新