नियमित अभिव्यक्ति वी.एस. फिल्नाम ग्लोबिंग


15

मुझे पता है कि रेग्युलर एक्सप्रेशंस का इस्तेमाल केवल किरदारों और स्ट्रिंग्स के साथ किया जाना है, लेकिन कभी-कभी मैं उन्हें फाइलों के नाम से भी ढूंढता हूं। मेरा सवाल यह है: regexes केवल पात्रों के साथ या फ़ाइल नाम के साथ भी उपयोग किया जाता है?

जवाबों:


19

नियमित अभिव्यक्ति और फ़ाइल नाम ग्लोबिंग दो बहुत अलग चीजें हैं।

पाठ में पैटर्न मिलान के लिए कमांड / फ़ंक्शन में नियमित अभिव्यक्ति का उपयोग किया जाता है। उदाहरण के लिए grep, या प्रोग्रामिंग भाषाओं में पैटर्न पैरामीटर ।

फ़ाइल नाम ग्लोबिंग का उपयोग शेल्क्स द्वारा फ़ाइल और निर्देशिका नाम वाइल्डकार्ड का उपयोग करने के लिए किया जाता है। गोलाबारी की क्षमता शेल पर निर्भर करती है। उदाहरण के लिए बैश, वाइल्डकार्ड का समर्थन करता है जैसे:

  • * मैच 0 या अधिक वर्ण
  • ? मैच 1 चरित्र
  • [...] निर्दिष्ट सेट में एक चरित्र से मेल खाते हैं

ये वाइल्डकार्ड नियमित अभिव्यक्ति के समान दिख सकते हैं, वास्तव [...]में ग्लोबिंग और रेगेक्स में समान अर्थ है। लेकिन *और ?ग्लोबिंग और regex में मतलब अलग बातें।

एक टिप्पणी में आपने लिखा है:

लेकिन कैसे दुभाषिया अंतर * कि यह एक जोकर या regex है? उदाहरण के लिए grep a*b a*.txt:?

आसान। की तरह।

सबसे पहले, शेल वाइल्डकार्ड्स की व्याख्या करने की कोशिश करता है, उन्हें फाइलनाम के खिलाफ मिलान करके। यदि फाइलें "ए" से शुरू होती हैं और "बी" के साथ समाप्त होती हैं, तो शेल a*bमिलान फाइलनाम के साथ बदल जाएगा । उसी के लिए जाता है a*.txt। यदि कोई मेल फ़ाइल नाम नहीं हैं, तो शेल तर्कों को पारित कर देगा grepजैसा कि वे थे, शाब्दिक रूप से।

हालांकि, पहले पैरामीटर का grepएक पैटर्न होना चाहिए। 99.999% व्यावहारिक उपयोग के मामलों में आप पहले पैरामीटर को शेल द्वारा व्याख्या नहीं करना चाहते हैं। तो सबसे शायद यही इरादा था:

grep "a*b" a*.txt

उद्धृत करने के लिए धन्यवाद a*b, शेल इसे ग्लोबिंग का उपयोग करके व्याख्या नहीं करेगा, और इसके बजाय इसे सीधे पास करेगा grep। बदले में, grepव्याख्या करेगा कि एक नियमित अभिव्यक्ति (डिजाइन द्वारा) के रूप में।

इसे योग करने के लिए, शेल अपनी स्वयं की गोलाकार भाषा के बाद कमांड लाइन की व्याख्या करता है, जो वाइल्डकार्ड का उपयोग कर रही है। कमांड, प्रोग्राम अपने मापदंडों की व्याख्या करते हैं जिस तरह से वे अपने लेखकों द्वारा डिजाइन किए गए थे।


4

यदि फ़ाइल नाम आपके लिए एक स्ट्रिंग है, तो आप फ़ाइल नाम के लिए भी रेगेक्स का उपयोग कर सकते हैं। उदाहरण के लिए: यदि आप एक regex से मेल खाते फ़ाइल नाम ढूंढना चाहते हैं, तो आप कोशिश कर सकते हैं:

find ./ -regex '.*[abc][xyz].*'

कमांड उन फ़ाइलों की तलाश करता है जिनके नाम में x, y या z के बाद a, b या c हैं। यह तो केवल एक उदाहरण है। अंतहीन कब्जे हैं।


लेकिन कैसे दुभाषिया अंतर * कि यह एक जोकर या regex है? उदाहरण के लिए: $ grep एक "asterix" b "a asterix" .txt
Hamza

2
यदि आप उपयोग find ./ -name 'a*'करते हैं तो आप एक वाइल्डकार्ड के रूप में * का उपयोग करते हैं। जब आप टाइप करते हैं find ./ -regex 'a*', तो आप एक रेगेक्स में * का उपयोग करते हैं। महत्वपूर्ण अंतर स्विच -nameया है -regex
कोई भी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.