Regex 如何解决;选择字符串-模式";通过管道返回对象而不使用foreach循环?
假设我有一个包含以下内容的文件:Regex 如何解决;选择字符串-模式";通过管道返回对象而不使用foreach循环?,regex,powershell,pipeline,Regex,Powershell,Pipeline,假设我有一个包含以下内容的文件: 1,first_string,somevalue 2,second_string,someothervalue n,n_nd_string,somemorevalue 我需要获取该文件的内容,获取最后一个字符串,并获取“,”符号前的数字(在本例中为n)。(我将只增加它并将n+1字符串附加到此文件,但现在这并不重要)。我希望所有这些都用管道级联完成 到目前为止,我已经找到了这个解决方案: [int]$number=获取内容。\1.mpcpl |选择对象-最后一个
1,first_string,somevalue
2,second_string,someothervalue
n,n_nd_string,somemorevalue
我需要获取该文件的内容,获取最后一个字符串,并获取“,”符号前的数字(在本例中为n)。(我将只增加它并将n+1字符串附加到此文件,但现在这并不重要)。我希望所有这些都用管道级联完成
到目前为止,我已经找到了这个解决方案:
[int]$number=获取内容。\1.mpcpl |选择对象-最后一个1 |选择字符串-模式^(\d)| ForEach对象{$|.matches.value}
它实际上可以工作,但我想知道是否有任何方法可以在不使用foreach循环的情况下寻址Select String-Pattern“^(\d)”返回对象?因为我知道在我的例子中,return集合只包含一个1元素(我正在选择一个文件的最后一个字符串,我只得到一个匹配项)您可以使用
$num = [int]((Get-Content .\1.mpcpl | Select-Object -Last 1) -replace '^(\d).*', '$1')
注释
-读取文件并获取最后一行(获取内容。\1.mpcpl |选择对象-最后一行)
-从返回的行中获取第一个数字(注意:如果该行没有以数字开头,它将失败,因为输出将是整行)(…-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]
在我看来它就像一个csv
import-csv 1.mpcpl -header field1,field2,field3 | select -last 1 | select -expand field1
输出:
n
您可能需要一个
-match
操作符来仅获取第一个匹配项。或者-replace
:-replace'^(\d.*')、'$1'
hm,但是如何在管道中准确应用-match或-replace运算符?例如,在我得到一个文件的最后一个字符串后。这是一个很好的字符串,但这个特定的文件可能看起来像一个csv文件,但它不一定应该是csv文件,所以我决定为不同的数据结构提供更通用的解决方案,具有一个共同的特性--每行开头的行号。我喜欢括号解决方案。谢谢