2011-04-12 4 views
69

ढूंढें मुझे find कमांड के रेगेक्स का उपयोग करने में समस्या हो रही है। शायद कुछ मैं कमांड लाइन से बचने के बारे में नहीं समझता।लिनक्स रेगेक्स

ये समान क्यों नहीं हैं?

find -regex '.*[1234567890]' 
find -regex '.*[[:digit:]]' 

बैश, उबंटू

+0

आपको यह इंगित करने के लिए क्या आउटपुट है कि वे नहीं हैं? – shellter

उत्तर

50

रेगुलर एक्सप्रेशन find द्वारा इस्तेमाल किया डिफ़ॉल्ट नियमित अभिव्यक्ति वाक्य रचना में समर्थित नहीं हैं। उन्हें उपयोग करने के लिए आपको posix-extended जैसे एक अलग रेगेक्स प्रकार को निर्दिष्ट करने की आवश्यकता है।

जीएनयू ढूंढें नियमित अभिव्यक्ति documentation पर एक नज़र डालें जो आपको सभी रेगेक्स प्रकारों और वे क्या समर्थन देते हैं।

+0

धन्यवाद। वह दस्तावेज वह है जिसे मैं ढूंढना चाहता था। मुझे बस इतना मिल सकता था कि http://www.gnu.org/software/emacs/manual/html_node/elisp/Char-Classes.html#Char-Classes - जो यह सुझाव देता था कि चरित्र वर्ग * * emacs regex में समर्थित थे मोड "। – Dijkstra

+1

यह भी जांचें [Regular_expression # Character_classes] (http://en.wikipedia.org/wiki/Regular_expression#Character_classes) - बहुत उपयोगी संसाधन – asoundmove

67

आप find की -regextype तर्क पर एक नजर है चाहिए, manpage देखें:

 -regextype type 
      Changes the regular expression syntax understood by -regex and -iregex 
      tests which occur later on the command line. Currently-implemented 
      types are emacs (this is the default), posix-awk, posix-basic, 
      posix-egrep and posix-extended. 

मुझे लगता है कि emacs प्रकार [[:digit:]] निर्माण का समर्थन नहीं करता। मैं posix-extended के साथ की कोशिश की और यह उम्मीद के रूप में काम:

find -regextype posix-extended -regex '.*[1234567890]' 
find -regextype posix-extended -regex '.*[[:digit:]]' 
+2

मैंने सोचा कि यह हो सकता है, लेकिन मैंने emacs regex परिभाषाओं की जांच की और वे [: digit:] का समर्थन करने लगते हैं। http://www.gnu.org/software/emacs/manual/html_node/elisp/Char-Classes.html#Char-Classes – Dijkstra

2

ठीक है, तो आप इस '.*[0-9]'

+3

यह उनके प्रश्न का उत्तर नहीं है; आप बस अपने regex को फिर से लिखना ... –

27

ध्यान दें कि -regex पूरे रास्ते पर निर्भर करता है की कोशिश कर सकते हैं।

-regex pattern 
       File name matches regular expression pattern. 
       This is a match on the whole path, not a search. 

आप वास्तव में आप क्या कर रहे हैं के लिए -regex उपयोग करने के लिए नहीं है। चरित्र वर्गों (जैसे [[:digit:]]) के साथ

find . -iname "*[0-9]" 
+2

excplicit डॉट भी यहां unneeded है;) –