[英]why isn't this regex working : find ./ -regex '.*\(m\|h\)$
为什么这个正则表达式不起作用?
find ./ -regex '.*\(m\|h\)$
我注意到以下工作正常:
find ./ -regex '.*\(m\)$'
但是当我通过添加\\|h
添加“或文件名末尾的啊” \\|h
它不起作用。 也就是说,它应该拿起我所有的*.m
和*.h
文件,但我什么都没收到。
我在Mac OS X上。
在Mac OS X上,您无法使用\\|
在基本正则表达式中,默认情况下find
使用的正则表达式。
[基本]正则表达式在几个方面有所不同。 | 是一个普通的角色,没有相应的功能。
在这种情况下最简单的解决方法是将\\(m\\|h\\)
更改为[mh]
,例如
find ./ -regex '.*[mh]$'
或者您可以添加-E
选项以告诉find使用扩展正则表达式。
find -E ./ -regex '.*(m|h)$'
不幸的是-E
不便携。
另请注意,如果您只想列出以.m
或.h
结尾的文件,则必须转义点,例如
find ./ -regex '.*\.[mh]$'
如果您发现这一点令人困惑(我也是),那么有一个很棒的参考表可以显示哪些系统支持哪些功能。
更有效的解决方案是使用-o
标志:
find . -type f \( -name "*.m" -o -name "*.h" \)
但如果你想使用正则表达式:
find . -type f -regex ".*\.[mh]$"
好吧这有点hacky但是如果你不想在OSX上争论find的正则表达式限制,你可以将find的输出管道输出到grep:
find . | grep ".*\(\h\|m\)"
怎么了?
find . -name '*.[mh]' -type f
如果你想要花哨的模式,那么使用find2perl并破解模式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.