爲什麼不是這個表達式工作:
find ./ -regex '.*\(m\|h\)$
我注意,以下工作正常:
find ./ -regex '.*\(m\)$'
但是當我通過添加「\ | h」添加「或者在文件名的末尾啊」它不起作用。這是它應該拿起我所有* .m和* .h文件,但我沒有得到任何回報。
我在Mac OS X
爲什麼不是這個表達式工作:
find ./ -regex '.*\(m\|h\)$
我注意,以下工作正常:
find ./ -regex '.*\(m\)$'
但是當我通過添加「\ | h」添加「或者在文件名的末尾啊」它不起作用。這是它應該拿起我所有* .m和* .h文件,但我沒有得到任何回報。
我在Mac OS X
在Mac OS X,你不能在一個基本的正則表達式,這是find
使用默認使用\|
。
[基本]正則表達式在幾個方面有所不同。 |是一個普通的字符,並沒有相應的功能。
在這種情況下最簡單的修復方法是將\(m\|h\)
更改爲[mh]
,例如,
find ./ -regex '.*[mh]$'
或者你也可以添加-E
選項告訴找到使用擴展正則表達式來代替。
find -E ./ -regex '.*(m|h)$'
不幸的是-E
不是便攜式。
另請注意,如果您只想列出以.m
或.h
結尾的文件,則必須將點(例如,
find ./ -regex '.*\.[mh]$'
如果你覺得這混亂(我也是),有很大的參考表,顯示其功能都支持哪些系統上。
除非'find'使用不同的正則表達式,否則原來的'\(m \ | h \)'與字面上的「(m | h)」匹配,而不是「m」或「h」。當你解決這個問題時,你似乎只是提供一種解決方法,而你沒有解決* why *問題。 – coreyward 2011-05-06 00:18:06
不,根據[手冊頁](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
@Mikel - 謝謝「find ./ -regex'。* [mh] $'」很好用 – Greg 2011-05-06 00:22:21
一個更有效的解決方案是使用-o
標誌:
find . -type f \(-name "*.m" -o -name "*.h" \)
但如果你想在正則表達式使用:
find . -type f -regex ".*\.[mh]$"
這有什麼錯
find . -name '*.[mh]' -type f
如果你想花哨的圖案,然後使用find2perl和黑客模式。
好吧,這是一個小哈克,但如果你不想纏鬥在OSX上找到的正則表達式的限制,你可以找到管道輸出到grep:
find . | grep ".*\(\h\|m\)"
只需使用'找到。 -name'*。[mh]'-type f'。 – tchrist 2011-05-06 00:52:10