使用powershell查找与两个单独的正则表达式匹配的文件

时间:2012-03-12 16:44:41

标签: regex powershell powershell-v2.0

我想找到任何可以匹配两个正则表达式的文件,例如,至少包含bathatcat 之一的所有文件以及< / em>单词noun。这可以是任何可以匹配正则表达式[bhc]atnoun的文件。

select-string的正则表达式参数似乎只能在逐行的基础上运行。看来你可以传入逗号分隔的多个模式(select-string -pattern "[bhc]at","noun"),但它匹配任何一个,而不是两个。

4 个答案:

答案 0 :(得分:5)

您可以随时使用两个过滤器:

dir | ? {(gc $_) -match '[bhc]at'} | ?{(gc $_) -match 'noun'}

这只是获取与第一个条件匹配的所有对象,并检查第二个条件的结果集。我想它会比检查两者更快,因为很多文件只会被检查一次,然后过滤掉。

答案 1 :(得分:3)

这是一个只需要一个get-content:

dir | where-object{[string](get-content $_)|%{$_ -match "[bhc]at" -and $_ -match "noun"}}

答案 2 :(得分:2)

将@ mjolinor的单个get-content与@ JNK的优化过滤合并后:

dir | ?{ [string](gc $_) | ?{$_ -match "[bhc]at"} | ?{$_ -match "noun"} }

如果您不介意重复,可以将结果通过管道选择字符串以查看这些匹配项的上下文:

    | select-string -pattern "[bhc]at","noun" -allmatches

答案 3 :(得分:0)

我想出了相当繁琐而又有效的工作:

dir | where-object{((get-content $_) -match "[bhc]at") -and ((get-content $_) -match "noun")}

我可以用别名缩短这个,但是有更优雅的方式,最好用更少的击键吗?

我的另一个选择,如果这成为一个常见的问题,似乎是为上面的代码片段制作一个新的命令行开关。