powershell - 有没有办法使用 Select-String 打印行号和匹配值(不是行)?

标签 powershell

我正在使用 powershell 在多个文件中搜索与正则表达式的特定匹配项。因为它是一个正则表达式,所以我不想只看到我对正则表达式进行编程以接受的内容,以及它匹配的行号。

然后我想获取匹配的值和行号并创建一个对象以输出到 excel 文件。

我可以在单独的选择字符串语句中获取每个项目,但是它们不会相互匹配

Select-String -Path $pathToFile -Pattern '(?<={\n\s*Box\s=\s")14\d{3}(?=",)' | 
    Select LineNumber, Matches.Value 
#Will only print out the lineNumber

Select-String -Path $pathToFile -Pattern '(?<={\n\s*Box\s=\s")14\d{3}(?=",)' | 
    Foreach {$_.matches} | Select value 
#Will only print matched value and can't print linenumber

谁能帮我同时获取行号和匹配值?

编辑:只是为了澄清我在做什么

$files = Get-ChildItem $directory -Include *.vb,*.cs -Recurse
$colMatchedFiles = @()
foreach ($file in $files) {
    $fileContent = Select-String -Path $file -Pattern '(?<={\n\s*Box\s=\s")14\d{3}(?=",)' |
        Select-Object LineNumber, @{Name="Match"; Expression={$_.Matches[0].Groups[1].Value}}
    write-host $fileContent #just for checking if there is anything
}

这仍然没有得到任何东西,它只是输出了一堆空行

编辑:我希望此脚本搜索目录中所有文件的内容并找到与正则表达式匹配的行。以下是我期望循环中每个文件的输出

LineNumber Match
---------- -----
324        15
582        118
603        139
...        ...

文件匹配示例:

            {
            Box = "5015",
            Description = "test box 1"
            }....
            {
            Box = "5118",
            Description = "test box 2"
            }...
            {
            Box = "5139",
            Description = "test box 3"
            }...

最佳答案

例子1

选择 LineNumber和每场比赛的分组值。示例:

$sampleData = @'
prefix 1 A B suffix 1
prefix 2 A B suffix 2
'@ -split "`n"

$sampleData | Select-String '(A B)' |
    Select-Object LineNumber,
    @{Name="Match"; Expression={$_.Matches[0].Groups[1].Value}}

例子2

在 *.vb 和 *.cs 中搜索包含字符串 Box = "<n>" 的文件, 其中<n>是一些数字,并输出文件名,文件行号和box =上的数字线。示例代码:

Get-ChildItem $pathToFiles -Include *.cs,*.vb -Recurse |
  Select-String 'box = "(\d+)"' |
    Select-Object Path,
    LineNumber,
    @{Name="Match"; Expression={$_.Matches[0].Groups[1].Value -as [Int]}}

这将返回如下输出:

Path             LineNumber Match
----             ---------- -----
C:\Temp\test1.cs          2  5715
C:\Temp\test1.cs          6  5718
C:\Temp\test1.cs         10  5739
C:\Temp\test1.vb          2  5015
C:\Temp\test1.vb          6  5118
C:\Temp\test1.vb         10  5139

示例 3

现在我们知道我们希望匹配之前的行包含 { , 我们可以使用 -Context参数与 Select-String .示例:

Get-ChildItem $pathToFiles -Include *.cs,*.vb -Recurse |
  Select-String 'box = "(\d+)"' -Context 1 | ForEach-Object {
    # Line prior to match must contain '{' character
    if ( $_.Context.DisplayPreContext[0] -like "*{*" ) {
      [PSCustomObject] @{
        Path = $_.Path
        LineNumber = $_.LineNumber
        Match = $_.Matches[0].Groups[1].Value
      }
    }
  }

关于powershell - 有没有办法使用 Select-String 打印行号和匹配值(不是行)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46958005/

相关文章:

xml - 将变量保存到 xml 时出现字符串错误

powershell - powershell是否可以处理带有多个参数集的命令调用?

powershell - 继续事件订阅,脚本执行powershell后

powershell - 如何通过powershell删除文件夹的只读属性?

string - 将 PowerShell 对象转换为字符串

powershell - 当项目存在时,Get-AzureRmRecoveryServicesBackupItem 不返回任何内容

Azure Web应用程序克隆 powershell 脚本不起作用

powershell - 适用于com plus应用程序的Powershell更新

arrays - 在Powershell中,如何通过 “value”而不是 “reference”将对象存储在数组中?

regex - powershell:如何从字符串中转义所有正则表达式字符