`A [bc] d` (कोष्ठक) और` a {b, c} d` (ब्रेसिज़) में क्या अंतर है?


28

बीच क्या अंतर है a[bc]dऔर a{b,c}d? a{b,c}dजब पहले से ही है तो लोग इसका इस्तेमाल क्यों करते हैं a[bc]d?


आपको किसने उपयोग करने के लिए कहा था command a[bc]d?
जेसी_बी

3
यह निश्चित रूप से इसके उपयोग करता है अगर कोई इसे सही ढंग से समझता है।
वीजुन झोउ

7
मुझे लगता है कि मुझे समझ में नहीं आया कि दोनों के बीच भ्रम कैसे हुआ।
जेसी_बी

मुझे स्पष्ट रूप से एक सहकर्मी द्वारा लिनक्स पर कम परिचित से पूछा गया है, हालांकि हाल ही में नहीं।
वीजुन झोउ

@Jesse_b यदि आप कभी भी उन्हें फ़ाइलों की तरह संचालन के साथ आज़माते हैं lsऔर आप केवल एकल वर्णों को आज़माते हैं, तो वे उसी के लिए काम करेंगे।
नच -

जवाबों:


43

दोनों काफी अलग हैं।

a[bc]dएक फ़ाइल नाम पैटर्न है (गोले के अलावा अन्य fish)। इसका विस्तार दो फाइलनामों तक होगा abd और acdयदि वे मौजूदा निर्देशिका में मौजूदा फ़ाइलों के नाम हैं।

  • [...]भाग एक कोष्ठकों के भीतर अभिव्यक्ति है कि सूचीबद्ध (या जब पर्वतमाला शामिल किए गए हैं तत्वों का मिलान) लोगों में से एक भी अक्षर से मेल खाता है। पैटर्न से मेल खाने के लिए a[bc]d, तार aऔर dफ़ाइल नाम के बीच का वर्ण bया तो होना चाहिए या एक c

  • यदि abdमौजूद है, लेकिन acdऐसा नहीं है, तो यह केवल विस्तार करेगा abd, और इसके विपरीत।

  • तो न तो abd, और न ही acdमौजूद हैं, खोल और विकल्पों के आधार पर, यह एक त्रुटि (मूल यूनिक्स ट्रिगर करेगा sh, (t)csh, zsh, fish, bash -O failglob) और संभवतः खोल से बाहर निकलें, या पैटर्न unexpanded¹ छोड़ (बॉर्न की तरह और rcतरह के गोले) या करने के लिए विस्तार कुछ नहीं ( bash/zsh/yash -o nullglob, के कुछ पुराने संस्करण fish, मूल यूनिक्स shऔर (t)cshयदि एक ही कमांड में अन्य मिलान वाले ग्लोब हैं)।

a{b,c}dएक ब्रेस विस्तार (गोले में जो इनका समर्थन करते हैं) है। यह दो करने के लिए विस्तार होगा तार abd और acd

  • {...}भाग तार की अल्प विराम द्वारा सीमांकित सेट है (इस उदाहरण में, कुछ खोल में, यह भी इस तरह के रूप में एक सीमा हो सकती है a..kया 20..25या अधिक उन्नत की तरह लोगों को 00..20..2या 0..20..2%02d), और विस्तार फ्लैंकिंग के साथ इन तार के प्रत्येक संयोजन के द्वारा की जाती है तार aऔर d। ये तार एक ही चरित्र से अधिक लंबे हो सकते हैं और खुद भी ब्रेस एक्सपेंशन हो सकते हैं।

  • विस्तार इस बात की परवाह किए बिना होता है कि ये तार मौजूदा फाइलनामों से मेल खाते हैं या नहीं।

यदि आप स्ट्रिंग्स का निर्माण कर रहे हैं, तो ब्रेस विस्तार का उपयोग करें। यदि आप फ़ाइल नाम मिलान कर रहे हैं, तो फ़ाइल नाम पैटर्न का उपयोग करें।


Of इस विशेष मामले में, a[bc]dएक मौजूदा फ़ाइल का नाम हो सकता है , यही वजह है कि rm -f ./*.[ch]उन गोले जैसी चीजों का उपयोग करना संभवतः खतरनाक है और rm -f ./*.{c,h}एक समस्या से कम नहीं है।


स्पष्ट करने के लिए धन्यवाद "यदि पेट मौजूद है, लेकिन एसीडी नहीं है, तो यह केवल पेट तक फैल जाएगा"। मुझे लगता है कि मेरे जवाब से क्या गायब है।
वीजुन झोउ

9
एक और महत्वपूर्ण अंतर यह है कि a{b,c}d, bऔर cभागों को एक अक्षर होने की आवश्यकता नहीं है; उदा ex{ten,ci}sion। जबकि ex[tenci]sionया जो भी हो , इनमें से केवल एक पत्र से मेल खाएगा ।
एलेक्सिस

7

a[bc]dहै पैटर्न मिलान , और POSIX मानक का हिस्सा है। POSIX में, इसे "पैटर्न ब्रैकेट अभिव्यक्ति" के रूप में पेश किया गया है। यह मैनुअल के खंड 2.13 में प्रलेखित है

जब एक ब्रैकेट अभिव्यक्ति के बाहर और बाहर, निम्न तीन वर्णों का पैटर्न के विनिर्देशन में विशेष अर्थ होगा:

    ?
      प्रश्न-चिह्न एक पैटर्न है जो किसी भी वर्ण से मेल खाता है।
    *
      एक तारांकन एक ऐसा पैटर्न है जो कई वर्णों से मेल खाता है, जैसा कि कई वर्णों से मेल खाने वाले पैटर्न में वर्णित है।
    [
      खुला ब्रैकेट एक पैटर्न ब्रैकेट अभिव्यक्ति पेश करेगा।

धारा २.१३.३ में भी कुछ का उल्लेख है कि यह सामान्य रीगेक्स के लिए अलग-अलग व्यवहार करता है जब इसका उपयोग फ़ाइल नाम विस्तार (मेरे द्वारा जोर) के लिए किया जाता है

पैटर्न में अब तक वर्णित नियम एकल वर्ण और प्रतिमानों का मिलान करते हुए एकाधिक वर्णों का मिलान निम्न नियमों द्वारा योग्य है जो तब लागू होते हैं जब फ़ाइल नाम विस्तार के लिए पैटर्न मिलान संकेतन का उपयोग किया जाता है:

पथनाम में स्लैश वर्ण को पैटर्न में एक या अधिक स्लैश का उपयोग करके स्पष्ट रूप से मिलान किया जाएगा; यह न तो तारांकन या प्रश्न-चिह्न विशेष वर्णों से मेल खाना चाहिए और न ही एक ब्रैकेट अभिव्यक्ति द्वारा। ब्रैकेट के भाव से पहले पैटर्न में स्लैश की पहचान की जाएगी; इस प्रकार, एक स्लैश को फ़ाइल नाम विस्तार के लिए उपयोग किए जाने वाले पैटर्न ब्रैकेट अभिव्यक्ति में शामिल नहीं किया जा सकता है। यदि एक स्लैश कैरेक्टर एक समान ओपनिंग स्क्वायर ब्रैकेट से पहले एक अनकैप्ड ओपन स्क्वायर ब्रैकेट कैरेक्टर पाया जाता है, तो ओपन ब्रैकेट को एक साधारण कैरेक्टर माना जाएगा। उदाहरण के लिए, पैटर्न "a[b/c]d"ऐसे पैथनामों से मेल नहीं खाता abdया a/d। यह केवल शाब्दिक रूप से एक मार्गनाम से मेल खाता है a[b/c]d

a{b,c}dहै ब्रेसिज़ विस्तार , यह POSIX द्वारा विनिर्देश में नहीं है। यहाँ बैश मैनुअल (मेरे द्वारा जोर) से संबंधित भाग है :

ब्रेस विस्तार एक तंत्र है जिसके द्वारा मनमाने तार उत्पन्न किए जा सकते हैं। यह तंत्र फ़ाइल नाम विस्तार के समान है ( फाइलनाम विस्तार देखें), लेकिन उत्पन्न फ़ाइल नाम की आवश्यकता नहीं है । ब्रेस विस्तारित किए जाने वाले पैटर्न एक वैकल्पिक प्रस्तावना का रूप लेते हैं , इसके बाद कॉमा-पृथक स्ट्रिंग्स की एक श्रृंखला या ब्रेसिज़ की एक जोड़ी के बीच एक अनुक्रम अभिव्यक्ति, इसके बाद एक वैकल्पिक पोस्टस्क्रिप्ट होता है। प्रस्तावना को ब्रेसिज़ के भीतर निहित प्रत्येक स्ट्रिंग के लिए उपसर्ग किया जाता है, और पोस्टस्क्रिप्ट को फिर प्रत्येक परिणामी स्ट्रिंग से जोड़ दिया जाता है, बाएं से दाएं विस्तारित होता है।

@Mosvy की टिप्पणी के अनुसार, यह पहली बार दिखाई दिया था cshलेकिन व्यवहार में अन्य गोले bashसे भिन्न है csh। इस प्रकार के ब्रेस विस्तार भी मौजूद हैं glob(3)

एक अन्य प्रकार का ब्रेसिज़ विस्तार है {a..z}जो केवल bash3.0 के बाद दिखाई दिया , और bash4.0 में अधिक जोड़े गए हैं ।

एक शेल में जहां ग्लोबिंग चालू होता है, एक खाली फ़ोल्डर में निष्पादित होता है, निम्नलिखित परिणाम वापस आ जाता है

$ echo a[bc]d
a[bc]d
$ echo a{b,c}d
abd acd

@ Jesse_b की टिप्पणी के जवाब में, यदि आप एक इंटरैक्टिव शेल में हैं और दोनों लागू होते हैं, a[bc]dतो टाइप करने में कम परेशानी होती है। उदाहरण के लिए grep pattern [ab][12].txt


2
ब्रेस विस्तार एक "बैशीवाद" नहीं है; यह पहली बार सामने आया csh, बहुत पहले bash। यह ग्लोब (3) लाइब्रेरी फंक्शन में भी मौजूद है। अंतर यह है कि bashयह अन्य विस्तार से पहले किया जाता है: a=A; ab=A/B; ac=A/C; echo $a{b,c}किसी भी अन्य शेल से अलग तरीके से काम करेगा।
20

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