为什么这个正则表达式不起作用:find ./ -regex'。* \(m \ | h \)$

时间:2011-05-06 00:11:27

标签: regex macos

为什么这个正则表达式不起作用?

  find ./ -regex '.*\(m\|h\)$

我注意到以下工作正常:

  find ./ -regex '.*\(m\)$'

但是当我通过添加\|h添加“或文件名末尾的h”时,它不起作用。也就是说,它应该提取我的所有*.m*.h文件,但我什么都没收到。

我在Mac OS X上。

4 个答案:

答案 0 :(得分:27)

在Mac OS X上,您无法在基本正则表达式中使用\|,这是find默认使用的正则表达式。

re_format man page

  

[基本]正则表达式在几个方面有所不同。 |是一个普通的角色,没有相应的功能。

在这种情况下,最简单的解决方法是将\(m\|h\)更改为[mh],例如

find ./ -regex '.*[mh]$'

或者你可以添加-E选项来告诉find使用扩展正则表达式。

find -E ./ -regex '.*(m|h)$'

不幸的是-E不可移植。

另请注意,如果您只想列出以.m.h结尾的文件,则必须转义点,例如

find ./ -regex '.*\.[mh]$'

如果您发现这一点令人困惑(我也是),那么有一个很棒的参考表可以显示哪些系统支持哪些功能。

Regex Syntax Summary [Google Cache]

答案 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 并破解模式。