Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在文件中搜索正则表达式字符串并仅返回文件名、路径和字符串_Regex_String_Powershell_Search_Return - Fatal编程技术网

Regex 在文件中搜索正则表达式字符串并仅返回文件名、路径和字符串

Regex 在文件中搜索正则表达式字符串并仅返回文件名、路径和字符串,regex,string,powershell,search,return,Regex,String,Powershell,Search,Return,我被这个正则表达式字符串的搜索卡住了。情况如下: 我有一堆具有特定扩展名(*.tlt)的随机内容的文件 所有文件都位于驱动器F上BETA文件夹的子文件夹中: 每个文件的内容中至少有一个修订版1.234。(有时多次-只有第一次出现才重要) 这就是我到目前为止所做的: $files = gci f:\beta\ -Include "*.tlt" -Recurse $results = $files | Select-String -Pattern 'Revision:.+.

我被这个正则表达式字符串的搜索卡住了。情况如下:

  • 我有一堆具有特定扩展名(*.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,但不返回整行文件。

您已经接近了,但不可避免地需要遍历文件。注意
-过滤器
-包含
快得多,因为它在过滤之前不会收集所有对象

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

在以下帮助下,单一管道解决方案成为可能:

样本输出:

FullName                              Revision
--------                              --------
/Users/jdoe/foo.tlt                   Revision: 1.234
/Users/jdoe/sub/bar.tlt               Revision: 10.235
  • 如中所述,使用
    -Filter
    比使用
    -Include
    性能要好得多,因为
    -Filter
    在源位置进行筛选(让文件系统提供程序进行筛选),而不是先收集所有文件信息对象,然后让PowerShell进行筛选

  • $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
            }
        }
    }
    
  • Select String-List
    将每个输入文件中的匹配限制为第一个匹配

  • Select String
    输出的每个匹配都是一个实例,其中包含关于每个匹配的丰富元数据,例如带有完整输入文件名的
    .Path
    ,以及带有正则表达式(
    -Pattern
    )信息的
    .Matches
    )匹配-此元数据用于通过上述计算属性填充由
    Select Object
    创建的输出自定义对象


嗯,您当前只选择了
,因此无法按
文件名
进行分组。此外,如果要存储结果,则不应使用管道将表格格式化。存储结果,然后如果需要,稍后将其与
格式表一起显示。如果您只是为了分组而使用它,请改用
group Object
。请允许我向新来者提供标准建议:如果答案解决了您的问题,请单击大复选标记接受它(✓) 在它旁边,也可以选择向上投票(向上投票需要15点或更多的声誉点数)。如果您发现其他答案有帮助,请向上投票。接受(为此您将获得2点声誉点数)和向上投票有助于未来的读者。请查看。如果您的问题尚未完全回答,请提供反馈或。感谢您的建议。我现在已对其进行了标记,并向上投票支持这两个问题。