खोज आदेश के साथ “OR” रेगेक्स ऑपरेटर का उपयोग


2

नेट पर इन सवालों के बहुत सारे हैं, लेकिन मैं इस सरल समस्या को हल करने में असमर्थ था।

मेरे पास बहुत सारी छवियों के साथ एक निर्देशिका है, लेकिन मैं केवल संख्याओं की श्रेणी के आधार पर उनमें से एक सबसेट की प्रतिलिपि बनाना चाहता हूं। प्रत्येक चित्र का प्रारूप है: " [random characters][capture number].BMP "

उदाहरण के लिए: IZ000561.BMP

मैं इसके साथ संयोजन के रूप में उपयोग कर रहा हूं find और यह -regex विकल्प। मेरे द्वारा उपयोग की जाने वाली नियमित अभिव्यक्ति सरल थी:

.*(26[2-7]|27[0-2]).*

अगर मैं [262-267], [270-272] के टैग के साथ चित्रों का मिलान करना चाहता था। हालांकि यह दृष्टिकोण विफल रहा। मैं एक ऑनलाइन गया regex परीक्षक और सभी इस अभिव्यक्ति का उपयोग करके अपेक्षा के अनुरूप थे ऐसा होना ही चाहिए find रेगेक्स इंजन इस तरह के फ़िल्टरिंग के लिए एक अलग प्रारूप की उम्मीद करता है।

पूरी कमांड जो मैं उपयोग कर रहा था:

find /path/to/images/ -regex ".*(26[2-7]|27[0-2]).*" -exec echo {} \;

मैं जो करने की कोशिश कर रहा हूं, उसके लिए एक वैध अभिव्यक्ति क्या है?

जवाबों:


3

मुझे लगता है कि आपने अपना उत्तर पोस्ट कर दिया है, लेकिन यदि आप चाहते हैं कि आप जिस REGEX सिंटैक्स का उपयोग करना चाहते हैं, तो आप इस कमांड का उपयोग करके REGEX का प्रकार बदल सकते हैं:

-regextype TYPE

इसलिए मुझे विश्वास है कि मैं आपका काम करूंगा:

find /path/to/images/ -regextype sed -regex '.*(26[2-7]|27[0-2]).*' -exec echo {} \;

चाल कर सकते हैं।

इसके अलावा, सिर्फ एक नोट, आपका regex 262-267 या 270-272 के साथ कुछ भी मेल खाएगा। इसका मतलब है कि यह पकड़ लेंगे IZ262561.BMP, साथ ही साथ IZ134267.JPG, तथा ASDNASDNOANFOIAJFOIJDIO000262.EXE उदाहरण के लिए। मुझे यकीन नहीं है कि आप किन फ़ाइलों के साथ काम कर रहे हैं, लेकिन आपको अपने regex को संकीर्ण करने की आवश्यकता हो सकती है क्योंकि यह जो स्वीकार करेगा उस पर काफी ढीला है।


अभिव्यक्ति को और अधिक विशिष्ट बनाने के सुझाव के लिए +1। संख्याओं का अनुसरण हमेशा किया जाता है .BMP विस्तार, इसलिए यह करने का एक शानदार तरीका है। मैंने रेगेक्स प्रकार को बदलने के तर्क पर ध्यान दिया, लेकिन इसका उपयोग करने के लिए मैनुअल में कोई उदाहरण नहीं थे, या मान्य नहीं थे प्रकार इस स्विच के साथ उपयोग करने के लिए। धन्यवाद!
sherrellbc

मैं का उपयोग कर एक गलत पैरामीटर में टाइप करने की कोशिश की -regextype विकल्प और, निश्चित रूप से पर्याप्त, find समर्थित विकल्पों की रिपोर्ट इस प्रकार है: findutils-default, awk, egrep, ed, emacs, gnu-awk, grep, posix-awk, posix-basic, posix-egrep, posix-extended, posix-minimal-basic, sed
sherrellbc

2

वहाँ भी एक है -or (या -o ) ऑपरेटर को find आदेश। आप अपनी अभिव्यक्ति को दो उप-विभाजनों में विभाजित कर सकते हैं:

find /path/to/images/ -regex ".*(26[2-7]).*" -o -regex ".*(27[0-2]).*" -exec echo {} \;

-o POSIX आज्ञाकारी है, जबकि -or नहीं है:

के अनुसार find आदमी पृष्ठ:

   expr1 -o expr2
          Or; expr2 is not evaluated if expr1 is true.

   expr1 -or expr2
          Same as expr1 -o expr2, but not POSIX compliant.

1
मैंने इस पर ध्यान नहीं दिया। धन्यवाद!
sherrellbc

यार, तुमने मुझे पूरी तरह से सिरदर्द से बचा लिया। धन्यवाद!
Boris Burkov

1

के मैन पेज में पढ़ना find उपयोगी जानकारी देता है:

खोज द्वारा समझे गए नियमित भाव डिफ़ॉल्ट Emacs द्वारा हैं   नियमित अभिव्यक्ति।

तो, के वाक्यविन्यास में एक नज़र रखना Emacs Regex

enter image description here

ऐसा लगता है कि सभी विशेष पात्रों के साथ बच निकलने की आवश्यकता है \। इसे ध्यान में रखते हुए, नियमित अभिव्यक्ति को निम्नलिखित में बदलने के बाद अपेक्षित परिणाम प्राप्त हुए:

find /path/to/images/ -regex ".*\(26[2-7]\|27[0-2]\).*" -exec echo {} \;

मैंने इस प्रश्न को पोस्ट करने से पहले मैन पेज से परामर्श किया, लेकिन स्पष्ट रूप से पर्याप्त रूप से पर्याप्त नहीं था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.