फ़ाइलों को फ़िल्टर करने के लिए उपयोग किए जाने वाले वाइल्डकार्ड से नियमित अभिव्यक्ति कैसे भिन्न होती है


15

जब हम *शून्य या अधिक पिछले वर्णों को निरूपित करने के लिए grepउपयोग *.cकरते हैं , हम सभी C फ़ाइलों को खोजने के लिए उपयोग करते हैं जब हम इसे lsकमांड के साथ उपयोग करते हैं ls *.c। क्या कोई बता सकता है कि *इन दो मामलों में अलग-अलग का उपयोग कैसे किया जाता है ?

जवाबों:


30

शेल फ़ाइल नाम ग्लोबिंग और नियमित अभिव्यक्तियाँ कुछ समान वर्णों का उपयोग करती हैं, और उनके समान उद्देश्य हैं, लेकिन आप सही हैं, वे संगत नहीं हैं। फ़ाइल नाम ग्लोबिंग एक बहुत कम शक्तिशाली प्रणाली है।

फ़ाइल नाम ग्लोबिंग में:

  • * "शून्य या अधिक वर्ण"

  • ? का अर्थ है "कोई भी एकल चरित्र"

लेकिन रीगेक्स में, आपको .*"शून्य या अधिक वर्ण" का .अर्थ करना होगा , और इसका अर्थ है "कोई भी एकल वर्ण।" ?रीजैक्स में ए का अर्थ कुछ अलग है: पूर्ववर्ती आरई तत्व का शून्य या एक उदाहरण।

स्क्वायर कोष्ठक ( []) कम से कम सरल मामलों के लिए मैं जिस सिस्टम पर यह टाइप कर रहा हूं, दोनों प्रणालियों में समान काम करता है। इसमें POSIX वर्ण वर्ग (जैसे [:alpha:]) जैसी चीजें शामिल हैं । उस ने कहा, यदि आपको कई अलग-अलग सिस्टम प्रकारों पर काम करने के लिए आपके आदेशों की आवश्यकता है, तो मैं प्रारंभिक चीजों से परे कुछ भी उपयोग करने की सलाह देता हूं जैसे कि वर्णों की सूची (जैसे [abeq]) और शायद चरित्र पर्वतमाला (जैसे [a-c])।

इन अंतरों का मतलब है कि दो सिस्टम सरल मामलों के लिए सीधे विनिमेय हैं। यदि आपको फ़ाइल नाम के regex मिलान की आवश्यकता है, तो आपको इसे अन्य तरीके से करने की आवश्यकता है। find -regexएक विकल्प है। (ध्यान दें कि वहाँ है find -name, वैसे भी, जो ग्लोब सिंटैक्स का उपयोग करता है।)


2
मुझे नहीं पता कि इसे
ग्लोबिंग

3
इसके अलावा, रेगेक्स के विभिन्न स्वाद हैं। नहीं सभी regexes एक ही बनाया जाता है! और अगर आप इस तरह के एसक्यूएल ही कई अन्य पैटर्न मिलान प्रणाली, है की तरह है, जहां '%'साधन '*'
श्री लिस्टर

4
Regexp के दो प्रमुख फ्लेवर हैं POSIX और PCRE (पर्ल कम्पेटिबल आरई)। बाद में कम लंबी घुमावदार और कुछ और विशेषताएं हैं। यूनिक्स उपकरण और गोले आमतौर पर POSIX का उपयोग करते हैं, अधिकांश प्रोग्रामिंग लैंग्वेज बिल्ट-इन regexps (शेल को छोड़कर) PCRE का उपयोग करते हैं। जब आप ऑन-लाइन सामग्री पढ़ रहे हों तो बस अंतर से सावधान रहें।
गोल्डीलॉक्स 15

11

मूल शीर्षक में व्यक्त किए गए प्रश्न का उत्तर:

फ़ाइलों को फ़िल्टर करने के लिए उपयोग की जाने वाली नियमित अभिव्यक्तियाँ क्यों भिन्न होती हैं?

फ़ाइल नाम विस्तार नियमित अभिव्यक्तियों को पूर्व निर्धारित करता है, पहले से ही अधिकांश ऑपरेटिंग सिस्टम (वाइल्डकार्ड / जोकर वर्ण) के साथ मौजूद है और बाद वाले की तुलना में बहुत सरल और सहज है।

जबकि *.txtआकस्मिक उपयोगकर्ताओं द्वारा आसानी से समझा जा सकता है, अनुरूप .*\.txtकुछ अनुभवी उपयोगकर्ताओं / प्रोग्रामर को लक्षित है , जिसका उल्लेख नहीं है ^.*\.txt$...


2
"क्यों" भाग के लिए एक और कारण: गति। नियमित अभिव्यक्तियाँ धीमी हैं: pastebin.com/3iNCgkE3
manatwork

3
*.txtबराबर नहीं है .*\.txt, यह (ज्यादातर) बराबर होता है .*\.txt$क्योंकि .txt(कम से कम उचित फ़ाइल नाम ग्लोबिंग मानने के बाद) कुछ भी नहीं हो सकता है । शायद ^.*\.txt$उपयोग के आधार पर भी कुछ हद तक। अपनी बात साबित करता है?
बजे एक सीवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.