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
在源位置进行筛选(让文件系统提供程序进行筛选),而不是先收集所有文件信息对象,然后让PowerShell进行筛选-Filter
$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点声誉点数)和向上投票有助于未来的读者。请查看。如果您的问题尚未完全回答,请提供反馈或。感谢您的建议。我现在已对其进行了标记,并向上投票支持这两个问题。