在 Powershell 中使用 Select-Object,我如何才能 select 每行只显示我想要的字符串部分?

Using Select-Object in Powershell, how can I select only the part of a string I want on a per line basis?

目前我有一个脚本可以搜索一个目录并查找所有“dummy”一词的实例。然后它将文件名、路径、行号、行输出到 CSV 文件。

此行包含非常标准化的结果,例如:

我正在尝试寻找一种方法来在我的 CSV 中输出一个附加列,该列包含“?”之前的所有字符。以及“dummy”之后的所有字符。

结果行将是:

我尝试使用拆分,但它一直在删除其他字符。是否可以找到“dummy”和“?”的索引?然后把中间部分子串出来?

如有任何帮助,我们将不胜感激。

目前的代码:

Write-Host "Hello, World!"

# path
$path = 'C:\Users\Documents_Testing\fe\*.ts'
# pattern to find dummy
$pattern = "dummy,"

Get-ChildItem -Recurse  -Path $path | Select-String -Pattern $pattern |
Select-Object FileName,Path,LineNumber,Line
,@{name='Function';expression={
    $_.Line.Split("dummy,")
}} |
Export-Csv 'C:\Users\User\Documents_Testing\Output1.csv' -NoTypeInformation

Write-Host "Complete"

使用 -replace 运算符将整行替换为 dummy,? 之间的部分:

PS ~> 'Hi I am a dummy, who are you?' -replace '^.*dummy,\s*(.*)\?\s*$', ''
who are you

所以您计算出的 属性 定义应该是这样的:

@{Name = 'Function'; Expression = { $_.Line -replace '^.*dummy,\s*(.*)\?\s*$', '' }}

上面使用的模式说明:

^         # start of string
 .*       # 0 or more of any character
 dummy,   # the literal substring `dummy,`
 \s*      # 0 or more whitespace characters
 (        # start of capture group
  .*      # 0 or more of any character
 )        # end capture group
 \?       # a literal question mark
 \s*      # 0 or more whitespace characters
$         # end of line/string

如果您还想删除第一个 ? 之后的所有内容,请稍微更改模式:

@{Name = 'Function'; Expression = { $_.Line -replace '^.*dummy,\s*(.*?)\?.*$', '' }}

将元字符 ? 添加到 .* 使子表达式 惰性 ,这意味着正则表达式引擎尝试匹配 尽可能少的字符 尽可能 - 这意味着我们只会捕获到 first ?.