कैसे जांचें कि स्ट्रिंग में बाश में एक सबस्ट्रिंग है या नहीं

How Check If String Contains Substring Bash



सवाल यह है कि कैसे जांचें कि स्ट्रिंग में बैश में एक सबस्ट्रिंग है या नहीं। उत्तर है: पैटर्न मिलान का उपयोग करें। यह एक और प्रश्न को जन्म देता है, जो है: पैटर्न मिलान क्या है? खैर, एक वाक्य में एक वाक्यांश की कुछ विशेषताएं होती हैं। यही कारण है कि यह एक ही वाक्य या अन्य वाक्यों में अन्य वाक्यांशों से भिन्न होता है। विशेषताओं को एक पैटर्न के रूप में कोडित किया जा सकता है। इस तरह, एक स्ट्रिंग में एक विशेष वाक्यांश की पहचान की जा सकती है। यह आलेख बताता है कि किसी बड़ी स्ट्रिंग में किसी विशेष सबस्ट्रिंग की पहचान कैसे करें, मिलान किए गए सबस्ट्रिंग को किसी अन्य सबस्ट्रिंग से बदलें, और इंडेक्स द्वारा किसी बड़े स्ट्रिंग में किसी भी सबस्ट्रिंग का पता लगाएं। हालांकि, स्पष्टीकरण में गोता लगाने से पहले, किसी को बैश में एक स्ट्रिंग की स्थापना के विभिन्न तरीकों को याद करना होगा।

रिक्त स्थान से बचकर स्ट्रिंग

प्रत्येक स्पेस को स्पेस एस्केप सीक्वेंस, '' से बदलकर एक स्ट्रिंग का निर्माण किया जा सकता है; जैसे की:







माय वार=पर्यटनमें मिस्र is one of the देश 'एस अग्रणी आर्थिक उद्योग।
फेंक दिया $myVar

आउटपुट है:



मिस्र में पर्यटन देश के प्रमुख आर्थिक उद्योगों में से एक है।



नोट: एपॉस्ट्रॉफी में स्पेस एस्केप सीक्वेंस का भी इस्तेमाल किया गया है।





सिंगल कोट्स द्वारा स्ट्रिंग

क्या प्रोग्रामर के पास स्ट्रिंग में सभी रिक्त स्थान से बचने का समय है? नहीं। इसलिए, एक स्ट्रिंग को सीमित करने के लिए दो सिंगल कोट्स का उपयोग करना बेहतर है; जैसे कि:

माय वार='मिस्र में पर्यटन देश में से एक है' 'के प्रमुख आर्थिक उद्योग।'

एक एकल-उद्धृत स्ट्रिंग किसी भी एस्केप अनुक्रम के विस्तार (इसके प्रभाव से प्रतिस्थापित) की अनुमति नहीं देती है। सौभाग्य से, यदि दो स्ट्रिंग्स को एक-दूसरे के बगल में कोडित किया जाता है, तो उन्हें एक स्ट्रिंग के रूप में लिया जाएगा। जैसा कि ऊपर किया गया है, बीच में एक एस्केप अनुक्रम डाला जा सकता है। भागने के क्रम का विस्तार किया जाएगा। तो आउटपुट बन जाता है:



मिस्र में पर्यटन देश के प्रमुख आर्थिक उद्योगों में से एक है।

डबल कोट्स द्वारा स्ट्रिंग

दोहरे उद्धरण चिह्नों के साथ, एस्केप अनुक्रमों का भी विस्तार नहीं किया जाता है, लेकिन चर का विस्तार किया जाता है। निम्नलिखित कोड इसे दिखाता है:

माय वार=पर्यटनमें मिस्र is one of the देश 'एस अग्रणी आर्थिक उद्योग।
फेंक दिया $myVar

आउटपुट है:

मिस्र में पर्यटन देश के प्रमुख आर्थिक उद्योगों में से एक है।

नोट: एपॉस्ट्रॉफी में स्पेस एस्केप सीक्वेंस का भी इस्तेमाल किया गया है।

इस लेख में, सिंगल कोट्स में स्ट्रिंग का मुख्य प्रकार माना जाता है।

रेगुलर एक्सप्रेशन फंडामेंटल

regex

इस स्ट्रिंग पर विचार करें:

यह दुनिया वास्तव में हमारा घर नहीं है।

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

सरल मिलान

निम्नलिखित कोड में, यदि लक्ष्य में 'दुनिया' शब्द मिलता है, तो हम कहेंगे कि शब्द का मिलान किया गया है।

पी='यह दुनिया वास्तव में हमारा घर नहीं है।'
रेग='दुनिया'
अगर [[ $ str= ~$reg ]];फिर
फेंक दियामिला
अन्यथा
फेंक दियापता नहीं चला
होना

=~ , जो असाइनमेंट ऑपरेटर है जिसके बाद ~ है, उसे बाइंडिंग ऑपरेटर कहा जाता है। शर्त यह जांचती है कि पैटर्न लक्ष्य स्ट्रिंग में मेल खाता है या नहीं। यदि लक्ष्य में पैटर्न के अनुरूप एक सबस्ट्रिंग पाया जाता है, तो इको स्टेटमेंट प्रदर्शित होता है। यदि यह नहीं पाया जाता है, तो प्रतिध्वनि कथन प्रतिध्वनित नहीं होता है। इस कोड के लिए आउटपुट है:

मिला

जैसे पैटर्न, संसार, लक्ष्य में पाया जाता है। ध्यान दें कि [[ और पहले ]] के बाद परिसीमन स्थान बनाए रखा गया है।

प्रतिरूप

उपरोक्त कोड में, उद्धरणों में 'दुनिया' रेगेक्स है जबकि दुनिया ही पैटर्न है। यह एक सीधा सा पैटर्न है। हालाँकि, अधिकांश पैटर्न इतने सरल नहीं हैं। एक पैटर्न पाया जाने वाला एक सबस्ट्रिंग का एक लक्षण वर्णन है। और इसलिए, बैश पैटर्न कुछ मेटाएक्टैक्टर्स का उपयोग करता है। एक मेटाकैरेक्टर अन्य पात्रों के बारे में एक चरित्र है। उदाहरण के लिए, बैश पैटर्न निम्नलिखित मेटाएक्टैक्टर का उपयोग करता है:

^ $ . * +? () [] {} |

डबल ब्रैकेट की स्थिति में एक नियमित अभिव्यक्ति भी टाइप की जा सकती है। लेकिन यह उद्धरणों में होना जरूरी नहीं है। तो, इस मामले में, यह सचमुच, एक पैटर्न है।

चरित्र वर्ग

वर्ग कोष्ठक

निम्नलिखित कोड का आउटपुट पाया जाता है, जिसका अर्थ है कि एक मैच हुआ:

पी='बिल्ली कक्ष में आ गई।'
अगर [[ $ str= ~[सीबीआर]पर]];फिर
फेंक दियामिला
होना

पैटर्न, [cbr]at ने बिल्ली का मिलान किया है, जो 'c' से शुरू होता है, और जो जारी रहता है और at पर समाप्त होता है। [cbr]at का अर्थ है, 'c' या 'b' या 'r' से मेल करें और उसके बाद at.

निम्नलिखित कोड का आउटपुट पाया जाता है, जिसका अर्थ है कि एक मैच हुआ:

पी='बल्ला कक्ष में आया।'
अगर [[ $ str= ~[सीबीआर]पर]];फिर
फेंक दियामिला
होना

पैटर्न, [cbr]at ने मैच किया हुआ बल्ला, जो 'b' से शुरू होता है, और जो जारी रहता है और at पर समाप्त होता है। [cbr]at का अर्थ है, 'c' या 'b' या 'r' से मेल करें और उसके बाद at.

निम्नलिखित कोड का आउटपुट पाया जाता है, जिसका अर्थ है कि एक मैच हुआ:

पी='चूहा कक्ष में आया।'
अगर [[ $ str= ~[सीबीआर]पर]];फिर
फेंक दियामिला
होना

पैटर्न, [cbr]at ने चूहे से मिलान किया है, जो 'r' से शुरू होता है, और जो जारी रहता है और at पर समाप्त होता है।

उपरोक्त कोड नमूनों में, प्रोग्रामर यह नहीं जानता है कि लक्ष्य स्ट्रिंग में बिल्ली या बल्ला या चूहा मौजूद है या नहीं। लेकिन, वह जानता है कि विकल्प 'सी' या 'बी' या 'आर' से शुरू होता है, फिर जारी रहता है और पर समाप्त होता है। एक पैटर्न में स्क्वायर ब्रैकेट विभिन्न संभावित वर्णों को लक्ष्य में दूसरों के सापेक्ष स्थिति में एक वर्ण से मेल खाने की अनुमति देते हैं। तो, वर्ग कोष्ठक में वर्णों का एक समूह होता है, जिनमें से एक का मिलान एक विकल्प के लिए किया जाता है। अंत में, यह पूरा सबस्ट्रिंग है जो मेल खाता है।

वर्णों की श्रेणी

उपरोक्त कोड में [cbr] एक वर्ग है। भले ही 'सी' या 'बी' या 'आर' एक ही वर्ण से मेल खाता हो, अगर वह तुरंत मेल नहीं खाता है, तो पैटर्न कुछ भी मेल नहीं खाएगा।

खैर, कुछ निश्चित श्रेणियां हैं जो एक वर्ग का निर्माण करेंगी। उदाहरण के लिए, ० से ९ अंक वर्ग बनाते हैं, [०-९] जिसमें ० और ९ शामिल हैं। लोअरकेस 'ए' से 'जेड' वर्ग [ए-जेड] बनाता है जिसमें 'ए' और 'जेड' शामिल है। अपरकेस 'ए' से 'जेड' वर्ग [ए-जेड] बनाता है जिसमें 'ए' और 'जेड' शामिल है। एक वर्ग से, यह उन वर्णों में से एक है जो स्ट्रिंग में एक वर्ण से मेल खाएगा।

निम्नलिखित कोड एक मैच उत्पन्न करता है:

अगर [[ 'ID8id'= ~[0-9] ]];फिर
फेंक दियामिला
होना

इस बार लक्ष्य स्थिति में एक शाब्दिक स्ट्रिंग है। 8, जो कि सीमा के भीतर संभावित संख्याओं में से एक है, [0-9], स्ट्रिंग में 8 से मेल खाता है, 'ID8id'। उपरोक्त कोड इसके बराबर है:

अगर [[ 'ID8id'= ~[0123456789] ]];फिर
फेंक दियामिला
होना

यहाँ, पैटर्न में सभी संभावित संख्याएँ लिखी गई हैं, इसलिए कोई हाइफ़न नहीं है।

निम्नलिखित कोड में, एक मैच प्राप्त होता है:

अगर [[ 'ID8iD'= ~[ए-ज़ू] ]];फिर
फेंक दियामिला
होना

मैच रेंज के लोअरकेस 'i', [a-z] और टारगेट स्ट्रिंग के लोअरकेस 'i', 'ID8iD' के बीच है।

याद रखें: सीमा एक वर्ग है। कक्षा एक बड़े पैटर्न का हिस्सा हो सकती है। तो एक पैटर्न में, पाठ सामने और/या कक्षा के बाद हो सकता है। निम्नलिखित कोड इसे दिखाता है:

अगर [[ 'ID8id पहचानकर्ता है'=~ आईडी[0-9]पहचान ]];फिर
फेंक दियामिला
होना

आउटपुट है: मिला। पैटर्न से 'ID8id' लक्ष्य स्ट्रिंग में 'ID8id' से मेल खाता है।

नकार

निम्नलिखित कोड से मिलान प्राप्त नहीं होता है:

अगर [[ '01234567891011112'= ~[^0-9] ]];फिर
फेंक दियामिला
अन्यथा
फेंक दियापता नहीं चला
होना

आउटपुट है:

पता नहीं चला

श्रेणी के सामने ^ के बिना, वर्ग कोष्ठक के भीतर, श्रेणी का शून्य लक्ष्य स्ट्रिंग के पहले शून्य से मेल खाता होगा। तो, ^ किसी श्रेणी के सामने (या वैकल्पिक वर्ण) वर्ग को नकारता है।

निम्न कोड एक मैच उत्पन्न करता है क्योंकि शर्त पढ़ती है: लक्ष्य में कहीं भी किसी भी गैर-अंकीय वर्ण से मिलान करें:

अगर [[ 'एबीसीडीईएफघिज'= ~[^0-9] ]];फिर
फेंक दियामिला
अन्यथा
फेंक दियापता नहीं चला
होना

तो आउटपुट है: मिला।

[^0-9] का अर्थ है एक गैर-अंक, इसलिए [^0-9] [0-9] का निषेध है।

[^a-z] का अर्थ एक गैर-लोअरकेस अक्षर है, इसलिए [^a-z] [a-z] का निषेध है।

[^A-Z] का अर्थ एक अपरकेस अक्षर है, इसलिए [^A-Z] [A-Z] का निषेध है।

अन्य निषेध उपलब्ध हैं।

पैटर्न में अवधि (।)

पैटर्न में अवधि (.) स्वयं सहित किसी भी वर्ण से मेल खाती है। निम्नलिखित कोड पर विचार करें:

अगर [[ '6759WXY.A3'= ~ 7.9W.Y.A]];फिर
फेंक दियामिला
होना

कोड का आउटपुट पाया जाता है क्योंकि अन्य वर्ण मेल खाते हैं। एक बिंदु '5' से मेल खाता है; एक और बिंदु 'X' से मेल खाता है; और अंतिम बिंदु एक बिंदु से मेल खाता है।

मिलान विकल्प

लक्ष्य स्ट्रिंग के लिए इस वाक्य पर विचार करें:

पिंजरे में विभिन्न प्रकार के पक्षी हैं।

कोई जानना चाहेगा कि इस निशाने पर कबूतर है या मोर या चील। निम्नलिखित कोड का उपयोग किया जा सकता है:

पी='पिंजरे में विभिन्न प्रकार के मोर होते हैं।'
अगर [[ $ str=~ कबूतर|मोर|गिद्ध]];फिर
फेंक दियामिला
अन्यथा
फेंक दियापता नहीं चला
होना

आउटपुट है, पाया गया। अल्टरनेशन मेटाकैरेक्टर, | नियोजित किया गया है। दो, तीन, चार और अधिक विकल्प हो सकते हैं। इस कोड में जो मिला है वह 'मोर' है।

समूहन

निम्नलिखित पैटर्न में, वर्णों को समूहबद्ध करने के लिए कोष्ठक का उपयोग किया गया है:

एक मंच (नर्तक)

यहां का समूह एक मंच नर्तक है जो मेटाकैरेक्टर ( और ) से घिरा हुआ है। (नर्तक) एक उपसमूह है, जबकि एक मंच (नर्तक) संपूर्ण समूह है। निम्न पर विचार करें:

(नर्तक कमाल का है)

यहाँ, सबग्रुप या सबस्ट्रिंग है, डांसर कमाल का है।

सामान्य भागों के साथ सबस्ट्रिंग

एक हितधारक एक व्यवसाय में रुचि रखने वाला व्यक्ति होता है। एक वेबसाइट, स्टेक डॉट कॉम के साथ एक व्यवसाय की कल्पना करें। कल्पना कीजिए कि निम्न में से एक लक्ष्य स्ट्रिंग कंप्यूटर में है:

वेबसाइट, स्टेक.कॉम व्यवसाय के लिए है।;

हितधारक है।;

हितधारक स्टेक डॉट कॉम के लिए काम करता है।;

इनमें से किसी भी तार को लक्ष्य होने दें। प्रोग्रामर जानना चाह सकता है कि क्या स्टेक डॉट कॉम या हितधारक किसी भी लक्ष्य स्ट्रिंग में है। उसका पैटर्न होगा:

स्टेक.कॉम|हितधारक

प्रत्यावर्तन का उपयोग करना।

दांव दो शब्दों में दो बार टाइप किया गया है। इस प्रकार पैटर्न टाइप करके इससे बचा जा सकता है:

हिस्सेदारी (.com|धारक)

.com|धारक इस मामले में उपसमूह है।

नोट: इस मामले में वैकल्पिक वर्ण का उपयोग। स्टेक डॉट कॉम या स्टेकहोल्डर की अभी भी तलाशी ली जाएगी। निम्नलिखित कोड का आउटपुट पाया जाता है:

पी='वेबसाइट, स्टेक.कॉम व्यवसाय के लिए है।'
अगर [[ $ str=~ हिस्सेदारी(।साथ|धारक) ]];फिर
फेंक दियामिला
होना

यहां मिलान की गई सबस्ट्रिंग स्टेक.कॉम है।

BASH_REMATCH पूर्वनिर्धारित सरणी

BASH_REMATCH एक पूर्वनिर्धारित सरणी है। मान लें कि एक पैटर्न में समूह होते हैं। पूरा समूह मेल खाता है, इस सरणी के सूचकांक 0 के लिए सेल में जाता है। मेल खाने वाला पहला उपसमूह, इंडेक्स 1 के लिए सेल में जाता है; दूसरा उपसमूह मेल खाता है, इंडेक्स 2 के लिए सेल में जाता है, और इसी तरह। निम्न कोड दिखाता है कि इस सरणी का उपयोग कैसे करें:

पी='स्टेज डांसर आ गया है।'
अगर [[ $ str=~ चरण(नर्तकी) ]];फिर
फेंक दियामिला
होना

के लियेमैंमें ${!BASH_REMATCH[@]};करना
printf '${BASH_REMATCH[i]}, '
किया हुआ
फेंक दिया

आउटपुट है:

मिला
स्टेज डांसर, डांसर,

पूरा ग्रुप स्टेज डांसर है। केवल एक उपसमूह है, जो नर्तक है।

नोट: पैटर्न में जगह बच गई है।

अपर/लोअर केस इंडिपेंडेंस मैचिंग

मिलान, जैसा कि ऊपर बताया गया है, केस-संवेदी है। मिलान मामले से स्वतंत्र रूप से किया जा सकता है। यह निम्नलिखित कोड में दिखाया गया है:

दुकानें -एसनोकेसमैच

पी='हमें अच्छा संगीत पसंद है।'
अगर [[ $ str=~ अच्छा]];फिर
फेंक दियामिला
होना

दुकानें यूनोकेसमैच

आउटपुट है: मिला। पैटर्न है, GoOd। मिलान किया गया विकल्प 'अच्छा' है। नोट करें कि कैसे कोड खंड की शुरुआत में nocasematch विकल्प सक्षम किया गया है और कोड खंड के अंत में अक्षम किया गया है।

एक स्ट्रिंग की लंबाई

एक स्ट्रिंग की लंबाई प्राप्त करने के लिए सिंटैक्स है:

${#पैरामीटर}

उदाहरण:

पी='हमें अच्छा संगीत पसंद है।'
फेंक दिया $ {# str}

आउटपुट है: 19।

स्ट्रिंग कमी

स्ट्रिंग कमी के लिए वाक्यविन्यास हैं:

${पैरामीटर:ऑफ़सेट}
${पैरामीटर:ऑफ़सेट:LENGTH}

जहां OFFSET की गिनती शून्य से शुरू होती है।

निम्न उदाहरण दिखाता है कि स्ट्रिंग के पहले 11 वर्णों को कैसे हटाया जाए:

पी='मैं हमेशा अच्छे संगीत पर नृत्य करता हूं।'
फेंक दिया $ {str: 10}

आउटपुट है:

अच्छे संगीत के लिए।

LENGTH की गिनती अगले अक्षर से शुरू होती है। निम्नलिखित कोड दिखाता है कि कैसे स्ट्रिंग के भीतर एक हिस्से की अनुमति दी जा सकती है:

पी='मैं हमेशा अच्छे संगीत पर नृत्य करता हूं।'
फेंक दिया $ {str: 10: 6}

आउटपुट है:

ऐंस टू

पहले 11 अक्षर हटा दिए गए थे; अगले 6 वर्णों की अनुमति थी, और शेष वर्ण स्वचालित रूप से हटा दिए गए थे।

खोजें और बदलें

जब एक सबस्ट्रिंग पाया जाता है, तो इसे दूसरे सबस्ट्रिंग से बदला जा सकता है। इसके लिए वाक्यविन्यास हैं:

कहां=${पैरामीटर/पैटर्न/प्रतिस्थापन}
कहां=${पैरामीटर//पैटर्न/प्रतिस्थापन}
कहां=${पैरामीटर/पैटर्न}
कहां=${पैरामीटर//पैटर्न}

सिंगल फ़ॉरवर्ड स्लैश वाले पहले सिंटैक्स के लिए, केवल पहला मैच बदल दिया जाता है। उदाहरण:

पी='चैम्बर में एक चूहा, एक बल्ला और एक बिल्ली है।'
अधिकार=${str/[cbr]at/big cow}
फेंक दिया $ str
फेंक दिया $ रेट

आउटपुट है:

कक्ष में एक चूहा, एक बल्ला और एक बिल्ली है।
कक्ष में एक बड़ी गाय, एक बल्ला और एक बिल्ली है।

डबल फ़ॉरवर्ड स्लैश वाले दूसरे सिंटैक्स के लिए, मैच की सभी घटनाओं को बदल दिया जाता है। उदाहरण:

पी='चैम्बर में एक चूहा, एक बल्ला और एक बिल्ली है।'
अधिकार=${str//[cbr]at/big cow}
फेंक दिया $ str
फेंक दिया $ रेट

आउटपुट है:

कक्ष में एक चूहा, एक बल्ला और एक बिल्ली है।
कक्ष में एक बड़ी गाय, एक बड़ी गाय और एक बड़ी गाय है।

सिंगल फॉरवर्ड स्लैश वाले तीसरे सिंटैक्स के लिए, पहले और एकमात्र मैच के लिए कोई प्रतिस्थापन नहीं है।

साथ ही, पाया गया पहला सबस्ट्रिंग हटा दिया गया है। उदाहरण:

पी='चैम्बर में एक चूहा, एक बल्ला और एक बिल्ली है।'
अधिकार=${str/[cbr]पर}
फेंक दिया $ str
फेंक दिया $ रेट

डबल फॉरवर्ड स्लैश वाले चौथे सिंटैक्स के लिए, सभी मैचों के लिए कोई प्रतिस्थापन नहीं है। साथ ही, पाए गए सभी सबस्ट्रिंग हटा दिए जाते हैं। उदाहरण:

पी='चैम्बर में एक चूहा, एक बल्ला और एक बिल्ली है।'
अधिकार=${str//[cbr]at}
फेंक दिया $ str
फेंक दिया $ रेट

आउटपुट है:

कक्ष में एक चूहा, एक बल्ला और एक बिल्ली है।
कक्ष में a, a और a है।

निष्कर्ष

यह जांचने के लिए कि स्ट्रिंग में बैश में सबस्ट्रिंग है या नहीं, पैटर्न मिलान का उपयोग करना होगा। पैटर्न मिलान न केवल डबल ब्रैकेट की स्थिति में होता है, [[। . . ]]. यह ${ के साथ पैरामीटर विस्तार में भी हो सकता है। . .}. पैरामीटर विस्तार के साथ, इंडेक्स द्वारा सबस्ट्रिंग प्राप्त करना संभव है।

इस आलेख में जो प्रस्तुत किया गया है वह पैटर्न मिलान में सबसे महत्वपूर्ण बिंदु हैं। वहां अन्य हैं! हालाँकि, पाठक को आगे क्या अध्ययन करना चाहिए, वह है फ़ाइल नाम विस्तार।