如何在不使用foreach循环的情况下通过管道寻址“选择字符串-模式”返回对象?

时间:2019-08-28 19:29:50

标签: regex powershell pipeline

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

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

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

完成

到目前为止,我已经解决了这个问题:

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

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

2 个答案:

答案 0 :(得分: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')-从返回的行中获取第一位数字(注意:如果该行不是以数字开头,则将失败,因为输出将是整行)< / li>
  • [int]将字符串值转换为 int

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

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

(?m)^(\d).*\z模式将最后一行的数字移到组1中,即$matches[1]

答案 1 :(得分:0)

在我看来,这就像一个csv ...

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

输出:

n