如何在文件中查找所有正则表达式匹配项

时间:2013-11-17 11:24:36

标签: regex powershell

我有一个正则表达式列表(约2000)和超过一百万个html文件。我想检查每个文件上的每个正则表达式是否成功。如何在powershell上执行此操作?

性能很重要,所以我不想循环使用正则表达式。

我试试

$text | Select-String -Pattern pattern1, pattern2,...

它返回所有匹配,但我也想知道哪个模式成功哪个没有。我需要为每个文件构建一个成功的正则表达式列表

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

$regex = "^test","e2$"  #Or use (Get-Content <path to your regex file>)
$ht = @{}

#Modify Get-Childitem to your criterias(filter, path, recurse etc.)
Get-ChildItem -Filter *.txt | Select-String -Pattern $regex | ForEach-Object { 
    $ht[$_.Path] += @($_ | Select-Object -ExpandProperty Pattern)
}

试验输出:

$ht | Format-Table -AutoSize

Name                                               Value
----                                               -----
C:\Users\graimer\Desktop\New Text Document (2).txt {e2$}
C:\Users\graimer\Desktop\New Text Document.txt     {^test, e2$}

您未指定输出的输出方式。

更新:要在一行上匹配多个模式,请尝试此操作(mjolinor的答案可能比此更快)。

$regex = "^test","e2$"  #Or use (Get-Content <path to your regex file>)
$ht = @{}

#Modify Get-Childitem to your criterias(filter, path, recurse etc.)
$regex | ForEach-Object {
    $pattern = $_
    Get-ChildItem -Filter *.txt | Select-String -Pattern $pattern | ForEach-Object { 
        $ht[$_.Path] += @($_ | Select-Object -ExpandProperty Pattern)
    }
}

UPDATE2:我没有足够的样本来尝试它,但由于你有如此大量的文件,你很想在循环遍历模式之前尝试将文件读入内存。它可能会更快。

$regex = "^test","e2$"  #Or use (Get-Content <path to your regex file>)
$ht = @{}

#Modify Get-Childitem to your criterias(filter, path, recurse etc.)
Get-ChildItem -Filter *.txt | ForEach-Object {
    $text = $_ | Get-Content
    $filename = $_.FullName
    $regex | ForEach-Object {
        $text | Select-String -Pattern $_ | ForEach-Object { 
            $ht[$filename] += @($_ | Select-Object -ExpandProperty Pattern)
        }
    }
}

答案 1 :(得分:1)

我没有看到通过正则表达式集合做foreach的任何方法。

这是我能提出的最佳表现方式:

$regexes = 'pattern1','pattern2'
$files = get-childitem -Path  <file path> |
 select -ExpandProperty fullname

$ht = @{}

 foreach ($file in $files)
 {
   $ht[$file] = New-Object collections.arraylist
   foreach ($regex in $regexes)
    {
      if (select-string $regex $file -Quiet)
        {
          [void]$ht[$file].add($regex)
        }
    }
}

$ht

您可以通过使用后台作业并在作业之间分割文件集来加快此过程。