确认文件名的正则表达式

确认文件名的正则表达式

根据这个线程:

问:我的理解是 ack 使用 Perl 派生的正则表达式,这是正确的吗?

答:是的。事实上,ack是用Perl编写的,只是将表达式转发到内部引擎。

现在,我在当前目录下有一个文件,名为:

media_group_xml_producer.py

当我做:

> ack -n '.*group.*producer.*' 

或者更直接:

> ack -n --python '.*group.*producer.*' 

我没有得到任何结果。据我所知,正则表达式应该与该文件匹配。为什么它会错过呢?

答案1

如果您只需要 grep 当前目录中的文件名

ack 匹配文件的内容,而不是文件的名称。要查找名称与正则表达式匹配的文件,请对文件名列表运行 ack:

ls | ack '.*group.*producer.*'

你做了什么,即

ack -n '.*group.*producer.*'

将会在当前目录中查找文件含有与正则表达式匹配的东西。

如果您想在包含子目录路径的完整文件名上运行正则表达式

ls不会削减它,因为它没有选项来打印路径和文件名。相反,使用tree标志-i(不打印缩进线)和-f(打印完整文件名)。

tree -if | ack 'shepherd.*\.pyc?'

回报

./models/shepherd.py
./models/shepherd.pyc
./services/shepherd-related/flock_of_sheep.py
./services/shepherd-related/flock_of_sheep.pyc

当然,以上所有内容grep都适用于 and ack。但ack在各方面都绝对更好。 :-)

答案2

你误解ack了什么。它是一个grep模拟,而不是一个find模拟。它在文件内容中搜索给定模式,而不搜索与该模式匹配的文件名。你应该使用

find -regex '.*group.*producer.*' 

或者

find -name '*group*producer*' 

如果你坚持使用ack(尽管我认为这样做没有意义),你可以解析它的输出来获取你的文件:

$ ack -f | ack '.*group.*producer.*' 
media_group_xml_producer.py

它将ack -f只打印所有要搜索的文件,而不实际搜索任何内容,第二个将打印与您的正则表达式匹配的文件名。

相关内容