【问题标题】:How to address "Select-String -pattern" return object via pipeline without using foreach loop?如何在不使用 foreach 循环的情况下通过管道处理“Select-String -pattern”返回对象?
【发布时间】:2019-08-28 19:29:50
【问题描述】:

假设我有一个包含以下内容的文件:

1,first_string,somevalue
2,second_string,someothervalue
n,n_nd_string,somemorevalue

我需要获取此文件的内容,获取最后一个字符串并获取“,”符号之前的数字(在本例中为 n)。 (我只是增加它并将 n+1 字符串附加到这个文件,但现在没关系)。我希望用 pipeline cascade

完成所有这些工作

到目前为止,我已经找到了这个解决方案:

[int]$number = Get-Content .\1.mpcpl | Select-Object -Last 1 | Select-String -Pattern '^(\d)' | ForEach-Object {$_.matches.value}

它确实有效,但我想知道是否有任何方法可以在不使用 foreach 循环的情况下解决 Select-String -Pattern '^(\d)' 返回对象?因为我知道在我的情况下返回集合将仅包含 1 个元素(我选择文件的最后一个字符串并且我只得到一个匹配项)

【问题讨论】:

  • 您可能需要-match 运算符才能仅获取第一个匹配项。或-replace:-replace '^(\d).*', '$1'
  • hm,但我究竟如何在管道中应用 -match 或 -replace 运算符?例如,在我得到文件的最后一个字符串之后。

标签: regex powershell pipeline


【解决方案1】:

你可以使用

$num = [int]((Get-Content .\1.mpcpl | Select-Object -Last 1) -replace '^(\d).*', '$1')

备注

  • (Get-Content .\1.mpcpl | Select-Object -Last 1) - 读取文件并获取最后一行
  • (... -replace '^(\d).*', '$1') - 从返回的行中获取第一个数字(注意:如果该行不以数字开头,它将失败,因为输出将是整行)
  • [int] 将字符串值转换为 int

另一种方法是获取匹配项,然后从默认的 $matches 变量中检索它:

[IO.File]::ReadAllText($filepath) -match '(?m)^(\d).*\z' | Out-Null
[int]$matches[1]

(?m)^(\d).*\z 模式将最后一行开头的数字放入第 1 组,因此$matches[1]

【讨论】:

  • 我喜欢括号解决方案。谢谢
【解决方案2】:

对我来说它看起来像一个 csv...

import-csv 1.mpcpl -header field1,field2,field3 | select -last 1 | select -expand field1

输出:

n

【讨论】:

  • 一个很好,但是这个特定的文件可能看起来像一个 csv 文件,但它不一定应该是它,所以我决定为具有一个共同特征的不同数据结构获得更通用的解决方案 - 行号在每一行的开头。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2011-11-16
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
相关资源
最近更新 更多