根据这个线程:
问:我的理解是 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
只打印所有要搜索的文件,而不实际搜索任何内容,第二个将打印与您的正则表达式匹配的文件名。