繁体   English   中英

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

[英]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]$'

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

正则表达式语法摘要 [ Google Cache ]

更有效的解决方案是使用-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM