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

时间:2017-10-26 15:15:00

标签: 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 个答案:

答案 0 :(得分:2)

示例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

搜索包含字符串Box = "<n>"的文件的* .vb和* .cs,其中<n>是某个数字,并输出文件名,文件的行号和{{{ 1}}行。示例代码:

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]}}

示例3

现在我们知道我们希望匹配前的行包含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 ,我们可以将{参数与-Context一起使用。例如:

Select-String