2011-05-06 13 views
16

爲什麼不是這個表達式工作:

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

我注意,以下工作正常:

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

但是當我通過添加「\ | h」添加「或者在文件名的末尾啊」它不起作用。這是它應該拿起我所有* .m和* .h文件,但我沒有得到任何回報。

我在Mac OS X

+0

只需使用'找到。 -name'*。[mh]'-type f'。 – tchrist 2011-05-06 00:52:10

回答

26

在Mac OS X,你不能在一個基本的正則表達式,這是find使用默認使用\|

re_format man page

[基本]正則表達式在幾個方面有所不同。 |是一個普通的字符,並沒有相應的功能。

在這種情況下最簡單的修復方法是將\(m\|h\)更改爲[mh],例如,

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

或者你也可以添加-E選項告訴找到使用擴展正則表達式來代替。

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

不幸的是-E不是便攜式。

另請注意,如果您只想列出以.m.h結尾的文件,則必須將點(例如,

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

如果你覺得這混亂(我也是),有很大的參考表,顯示其功能都支持哪些系統上。

Regex Syntax Summary [Google Cache]

+0

除非'find'使用不同的正則表達式,否則原來的'\(m \ | h \)'與字面上的「(m | h)」匹配,而不是「m」或「h」。當你解決這個問題時,你似乎只是提供一種解決方法,而你沒有解決* why *問題。 – coreyward 2011-05-06 00:18:06

+0

不,根據[手冊頁](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/find.1.html),Mac OS/Darwin/BSD查找用法基本的正則表達式默認。 – Mikel 2011-05-06 00:20:08

+0

@Mikel - 謝謝「find ./ -regex'。* [mh] $'」很好用 – Greg 2011-05-06 00:22:21

7

一個更有效的解決方案是使用-o標誌:

find . -type f \(-name "*.m" -o -name "*.h" \) 

但如果你想在正則表達式使用:

find . -type f -regex ".*\.[mh]$" 
+0

謝謝 - 在這個 – Greg 2011-05-06 00:22:03

+0

上有一個「未知選項」,在第一個例子中'-type f'只適用於'-name「* .h」'(而不是'-name「* .m」' )由於優先。固定。 – Mikel 2011-05-06 00:51:19

+0

@Mikel謝謝,我沒有想到這一點。 – Wes 2011-05-06 00:55:18

1

這有什麼錯

find . -name '*.[mh]' -type f 

如果你想花哨的圖案,然後使用find2perl和黑客模式。

0

好吧,這是一個小哈克,但如果你不想纏鬥在OSX上找到的正則表達式的限制,你可以找到管道輸出到grep:

find . | grep ".*\(\h\|m\)" 
相關問題