जवाबों:
नियमित अभिव्यक्ति और फ़ाइल नाम ग्लोबिंग दो बहुत अलग चीजें हैं।
पाठ में पैटर्न मिलान के लिए कमांड / फ़ंक्शन में नियमित अभिव्यक्ति का उपयोग किया जाता है। उदाहरण के लिए 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
व्याख्या करेगा कि एक नियमित अभिव्यक्ति (डिजाइन द्वारा) के रूप में।
इसे योग करने के लिए, शेल अपनी स्वयं की गोलाकार भाषा के बाद कमांड लाइन की व्याख्या करता है, जो वाइल्डकार्ड का उपयोग कर रही है। कमांड, प्रोग्राम अपने मापदंडों की व्याख्या करते हैं जिस तरह से वे अपने लेखकों द्वारा डिजाइन किए गए थे।
यदि फ़ाइल नाम आपके लिए एक स्ट्रिंग है, तो आप फ़ाइल नाम के लिए भी रेगेक्स का उपयोग कर सकते हैं। उदाहरण के लिए: यदि आप एक regex से मेल खाते फ़ाइल नाम ढूंढना चाहते हैं, तो आप कोशिश कर सकते हैं:
find ./ -regex '.*[abc][xyz].*'
कमांड उन फ़ाइलों की तलाश करता है जिनके नाम में x, y या z के बाद a, b या c हैं। यह तो केवल एक उदाहरण है। अंतहीन कब्जे हैं।
find ./ -name 'a*'
करते हैं तो आप एक वाइल्डकार्ड के रूप में * का उपयोग करते हैं। जब आप टाइप करते हैं find ./ -regex 'a*'
, तो आप एक रेगेक्स में * का उपयोग करते हैं। महत्वपूर्ण अंतर स्विच -name
या है -regex
।