为什么这个正则表达式不起作用?
find ./ -regex '.*\(m\|h\)$
我注意到以下工作正常:
find ./ -regex '.*\(m\)$'
但是当我通过添加\|h
添加“或文件名末尾的h”时,它不起作用。也就是说,它应该提取我的所有*.m
和*.h
文件,但我什么都没收到。
我在Mac OS X上。
答案 0 :(得分:27)
在Mac OS X上,您无法在基本正则表达式中使用\|
,这是find
默认使用的正则表达式。
[基本]正则表达式在几个方面有所不同。 |是一个普通的角色,没有相应的功能。
在这种情况下,最简单的解决方法是将\(m\|h\)
更改为[mh]
,例如
find ./ -regex '.*[mh]$'
或者你可以添加-E
选项来告诉find使用扩展正则表达式。
find -E ./ -regex '.*(m|h)$'
不幸的是-E
不可移植。
另请注意,如果您只想列出以.m
或.h
结尾的文件,则必须转义点,例如
find ./ -regex '.*\.[mh]$'
如果您发现这一点令人困惑(我也是),那么有一个很棒的参考表可以显示哪些系统支持哪些功能。
答案 1 :(得分:10)
更有效的解决方案是使用-o
标志:
find . -type f \( -name "*.m" -o -name "*.h" \)
但是如果你想使用正则表达式:
find . -type f -regex ".*\.[mh]$"
答案 2 :(得分:3)
好吧这有点hacky但是如果你不想在OSX上争论find的正则表达式限制,你可以将查找输出管道输出到grep:
find . | grep ".*\(\h\|m\)"
答案 3 :(得分:1)
有什么问题
find . -name '*.[mh]' -type f
如果你想要花哨的模式,那么使用 find2perl 并破解模式。