为什么不是';这个正则表达式是否工作:find./-regex'*\(m\| h\)$
为什么这个正则表达式不起作用为什么不是';这个正则表达式是否工作:find./-regex'*\(m\| h\)$,regex,macos,Regex,Macos,为什么这个正则表达式不起作用 find ./ -regex '.*\(m\|h\)$ 我注意到以下方法很好: find ./ -regex '.*\(m\)$' 但是,当我通过添加\\124; h来添加“或在文件名末尾添加一个h”时,它不起作用。也就是说,它应该拾取我所有的*.m和*.h文件,但我什么也没有得到 我在Mac OS X上。在Mac OS X上,您不能在基本正则表达式中使用\\,这是find默认使用的 [基本]正则表达式在几个方面有所不同是一个普通字符,其功能没有等价物
find ./ -regex '.*\(m\|h\)$
我注意到以下方法很好:
find ./ -regex '.*\(m\)$'
但是,当我通过添加\\124; 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]$"
你怎么了
find . -name '*.[mh]' -type f
如果您想要奇特的模式,那么使用find2perl并破解该模式。好的,这有点破解,但是如果您不想在OSX上争论find的正则表达式限制,您可以将find的输出通过管道传输到grep:
find . | grep ".*\(\h\|m\)"
除非
find
使用了不同风格的正则表达式,否则原始的\(m\|h\)
是按字面意思匹配的(m\|h)
,而不是“m”或“h”。当你在解决这个问题时,似乎你只是提供了一种解决方法,而你没有说明原因。不,根据,Mac OS/Darwin/BSD find默认使用基本正则表达式。@Mikel Right…所以问题中的正则表达式不起作用的原因是因为它在转义字符。阅读理解与阅读速度成反比@科雷沃德:是和否。它实际上是在尝试从字面上匹配m\|h
。在Mac OS X上,支持\(
和\)
,但\
不支持。@Mikel:是的,我知道这是一个旧线程。我想我应该提到-E
应该在path变量之前。例如,第一个示例中的find-E./-regex.*(m | h)$”
-f类型
由于优先级原因,仅应用于-name“*.h”
(而不是-name“*.m”
)。修正了。@Mikel谢谢,我没想到。你为什么需要那种奇怪的\(…\)
。如果您链接-name-o-name…
只需使用查找即可-名称'*.[mh]'-类型f
。