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

Gre*_*reg 24 regex macos

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

  find ./ -regex '.*\(m\|h\)$
Run Code Online (Sandbox Code Playgroud)

我注意到以下工作正常:

  find ./ -regex '.*\(m\)$'
Run Code Online (Sandbox Code Playgroud)

但是,当我添加"或在文件名的末尾啊"通过添加\|h它不起作用.也就是说,它应该拿起我所有的*.m*.h文件,但我得到任何回报.

我在Mac OS X上.

Mik*_*kel 30

在Mac OS X上,您不能\|在基本正则表达式中使用,这是find默认情况下使用的正则表达式.

重新格式化手册页

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

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

find ./ -regex '.*[mh]$'
Run Code Online (Sandbox Code Playgroud)

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

find -E ./ -regex '.*(m|h)$'
Run Code Online (Sandbox Code Playgroud)

不幸的-E是不便携.

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

find ./ -regex '.*\.[mh]$'
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Mikel:是的,我知道这是一个旧线程。我想我会提到`-E`应该在*之前*路径变量。例如,`find -E ./ -regex ".*(m|h)$"` (3认同)

Wes*_*Wes 10

更有效的解决方案是使用-o标志:

find . -type f \( -name "*.m" -o -name "*.h" \)
Run Code Online (Sandbox Code Playgroud)

但如果你想使用正则表达式:

find . -type f -regex ".*\.[mh]$"
Run Code Online (Sandbox Code Playgroud)