繁体   English   中英

在文件中搜索RegEx字符串,仅返回文件名,路径和字符串

[英]Search for RegEx string in files and return ONLY file name, path and string

我有点搜索引擎正则表达式字符串。 场景如下:

  • 我有一堆带有随机内容的某些扩展名(* .tlt)的文件
  • 所有文件都位于驱动器F上的BETA文件夹的子文件夹中:
  • 每个文件在内容中的某处至少具有一个修订版1.234 (有时会多次-仅首次出现很重要)

这是我到目前为止的内容:

$files = gci f:\beta\ -Include "*.tlt" -Recurse
$results = $files |
           Select-String -Pattern 'Revision:.+.{1}[.]\d{1,3}'|
           ForEach-Object { $_.Matches } |
           select Value |
           Format-Table -GroupBy Filename

我需要的是一个PowerShell脚本,该脚本可搜索文件并返回具有完整路径的文件列表,并且仅包含修订版1.234,而不是整行。

您已经很亲密,但不可避免地需要遍历文件。 注意-Filter-Include快得多,因为它不会在过滤之前收集每个对象。

$fileList = Get-ChildItem -Path F:\beta -Filter *.tlt -Recurse
$results = foreach ($file in $fileList)
{
    $find = $file | Select-String -Pattern '(Revision:.+?\.\d{1,3})'
    if ($find)
    {
        @{
            Path = $file.FullName
            Rev  = $find.Matches.Groups[0].Value
        }
    }
}

借助计算出的属性,可以实现单管道解决方案:

Get-ChildItem f:\beta -Filter *.tlt -Recurse | 
  Select-String -List -Pattern 'Revision:.+?\.\d{3}' |
    Select-Object @{ n='FullName'; e='Path' }, @{ n='Revision'; e={ $_.Matches.Value } } 

样本输出:

FullName                              Revision
--------                              --------
/Users/jdoe/foo.tlt                   Revision: 1.234
/Users/jdoe/sub/bar.tlt               Revision: 10.235
  • 正如提到TheIncorrigible1的答案 ,使用-Filter执行比使用好得多-Include ,因为-Filter 在源过滤器(让文件系统提供商做过滤),而不是收集所有文件的信息对象,然后再让PowerShell的执行筛选。

  • Select-String -List将每个输入文件中的匹配限制为第一个匹配。

  • 由每个输出匹配Select-String[Microsoft.PowerShell.Commands.MatchInfo]实例,它包含关于每个匹配丰富的元数据,如.Path与全部输入文件名,和.Matches用约正则表达式什么信息( -Pattern )匹配-该元数据用于通过上述计算出的属性填充Select-Object创建的输出自定义对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM