कैसे निर्धारित करें कि क्या स्ट्रिंग में एक स्ट्रिंग दूसरे का विकल्प है?


49

मैं देखना चाहता हूं कि क्या एक स्ट्रिंग दूसरे स्ट्रिंग के एक हिस्से के अंदर है
उदाहरण के लिए:

'ab' in 'abc' -> true
'ab' in 'bcd' -> false

मैं इसे एक बैश स्क्रिप्ट की शर्त में कैसे कर सकता हूं?

जवाबों:


27

आप का उपयोग कर सकते ${VAR/subs}हैं जहां VARबड़ी स्ट्रिंग और subsस्ट्रिंग अपने खोजने की कोशिश कर रहे हैं:

my_string=abc
substring=ab
if [ "${my_string/$substring}" = "$my_string" ] ; then
  echo "${substring} is not in ${my_string}"
else
  echo "${substring} was found in ${my_string}"
fi

यह काम करता है क्योंकि ${VAR/subs}समान है, $VARलेकिन subsविशेष रूप से हटाए गए स्ट्रिंग की पहली घटना के साथ , यदि $VARइसमें शब्द शामिल नहीं है तो subsइसे संशोधित नहीं किया जाएगा।


मुझे लगता है कि आपको echoबयानों का क्रम बदलना चाहिए । क्योंकि मुझे मिलता हैab is not in abc
लुसियो

तुम सही हो! : पी
एडविन

मम्म .. नहीं, स्क्रिप्ट गलत है। जैसे मुझे मिलता है ab was found in abc, लेकिन अगर मैं उपयोग करता substring=zहूं तो मुझे मिलता हैz was found in abc
लुसियो

1
अब मैं मिलता हूं ab is not in abc। लेकिन z was found in abc। यह मजेदार है: डी
लुसियो

1
ओह! इस के शुरू में गूँज सही थी! XD
एडविन

47

[[ "bcd" =~ "ab" ]]
[[ "abc" =~ "ab" ]]

कोष्ठक परीक्षण के लिए हैं, और चूंकि यह डबल कोष्ठक है, इसलिए यह कुछ अतिरिक्त परीक्षण जैसे कर सकते हैं =~

तो आप इस फॉर्म को कुछ इस तरह इस्तेमाल कर सकते हैं

var1="ab"
var2="bcd"
if [[ "$var2" =~ "$var1" ]]; then
    echo "pass"
else
    echo "fail"
fi

संपादित करें: "= ~" सही किया गया, फ़्लिप किया गया।


1
मुझे failइस पैरामीटर के साथ मिलता है :var2="abcd"
लुसियो

3
@Lucio सही है [[ $string =~ $substring ]]। मैंने जवाब अपडेट किया।
एरिक कारवालो

12

बैश फाइलन पैटर्न (उर्फ "ग्लोब" पैटर्न) का उपयोग करना

substr=ab
[[ abc == *"$substr"* ]] && echo yes || echo no    # yes
[[ bcd == *"$substr"* ]] && echo yes || echo no    # no

अगर [["$ JAVA_OPTS"! = "-XX: + UseCompressedOops" ]]; फिर JAVA_OPTS = "$ JAVA_OPTS -XX: + UseCompressedOops" निर्यात करें; फाई
माइक स्लाइन

10

निम्नलिखित दो दृष्टिकोण किसी भी POSIX- अनुकूल वातावरण पर काम करेंगे, न कि केवल बैश में:

substr=ab
for s in abc bcd; do
    if case ${s} in *"${substr}"*) true;; *) false;; esac; then
        printf %s\\n "'${s}' contains '${substr}'"
    else
        printf %s\\n "'${s}' does not contain '${substr}'"
    fi
done
substr=ab
for s in abc bcd; do
    if printf %s\\n "${s}" | grep -qF "${substr}"; then
        printf %s\\n "'${s}' contains '${substr}'"
    else
        printf %s\\n "'${s}' does not contain '${substr}'"
    fi
done

उपरोक्त दोनों आउटपुट:

'abc' contains 'ab'
'bcd' does not contain 'ab'

पूर्व में एक अलग grepप्रक्रिया नहीं पैदा करने का लाभ है।

ध्यान दें कि मैं printf %s\\n "${foo}"इसके बजाय उपयोग करता हूं echo "${foo}"क्योंकि अगर यह बैकस्लैश होता है तो echoमैंंग सकता हूं ${foo}


पहला संस्करण xrandrचर में संग्रहीत मॉनिटर नामों की सूची में मॉनीटर के नाम का विकल्प खोजने के लिए पूरी तरह से काम करता है । +1 और 1K प्रतिनिधि क्लब में आपका स्वागत है :)
WinEunuuchs2Unix

6

शेल केस स्टेटमेंट

यह सबसे पोर्टेबल समाधान है, पुराने बॉर्न शेल और कोर्न शेल पर भी काम करेगा

#!/bin/bash
case "abcd" in
    *$1*) echo "It's a substring" ;;
    *) echo "Not a substring" ;;
esac

नमूना रन:

$ ./case_substr.sh "ab"                                                                                           
It's a substring
$ ./case_substr.sh "whatever"                                                                                     
Not a substring

ध्यान दें कि आपको विशेष रूप से उपयोग करने के echoलिए exit 1और exit 0सफलता या विफलता का संकेत देने के लिए उपयोग करने की आवश्यकता नहीं है ।

हम जो कुछ भी कर सकते थे, वह एक समारोह बना रहा है (जो कि आवश्यक हो तो बड़ी स्क्रिप्ट में इस्तेमाल किया जा सकता है) विशिष्ट रिटर्न वैल्यू के साथ (0 पर मैच, 1 पर कोई मैच नहीं):

$ ./substring_function.sh                                  
ab is substring

$ cat substring_function.sh                                
#!/bin/sh

is_substring(){
    case "$2" in
        *$1*) return 0;;
        *) return 1;;
    esac
}

main(){
   if is_substring "ab" "abcdefg"
   then
       echo "ab is substring"
   fi
}

main $@

ग्रेप

$ grep -q 'ab' <<< "abcd" && echo "it's a substring" || echo "not a substring"                                    
it's a substring

यह विशेष रूप से दृष्टिकोण के साथ उपयोगी है, अगर और बयान में bash। इसके अलावा ज्यादातर पोर्टेबल

AWK

$ awk '$0~/ab/{print "it is a substring"}' <<< "abcd"                                                             
it is a substring

अजगर

$ python -c 'import sys;sys.stdout.write("it is a substring") if "ab" in sys.stdin.read() else exit(1)' <<< "abcd"
it is a substring

माणिक

$ ruby -e ' puts "is substring" if  ARGV[1].include? ARGV[0]'  "ab" "abcdef"                                             
is substring

+1 ऊपर और सभी से परे जाने के लिए। मैंने यहां देखा और अन्य स्टैक एक्सचेंज साइटों पर कोई उत्तर स्ट्रिंग के भीतर सबस्ट्रिंग की भरपाई नहीं करता है। जो आज रात का मिशन है :)
WinEunuuchs2Unix

@ WinEunuuchs2Unix बैश में क्या करने जा रहे हैं?
सर्गी कोलोडियाज़नी

हां और नहीं, मैं एक फ्रेंकस्टीन परियोजना कर रहा हूं, जहां अजगर को सभी gmail.com संदेश मेटाडेटा मिलते हैं और इसे पार्स करते हैं और ड्रिल के साथ GUI सूची प्रस्तुत करते हैं। हालांकि मुझे इसका उत्तर मिला: stackoverflow.com/questions/5031764/…
WinEunuuchs2Unix

@ WinEunuuchs2Unix ठीक है। दिलचस्प लगता है। मैं व्यक्तिगत रूप से अजगर में सब कुछ पार्स करना पसंद करूंगा। इसमें केवल बैश की तुलना में टेक्स्ट प्रोसेसिंग के लिए कहीं अधिक क्षमताएं हैं।
सर्गी कोलोडियाज़नी

मैं लगभग दो साल से आपकी प्राथमिकताओं को जानता हूं और उनका सम्मान करता हूं। लेकिन मैं सिर्फ पायथन सीख रहा हूं और इसके भीतर काम करने की याद्दाश्त मुझे बोझिल लग रही है। सभी सरणी प्रसंस्करण का उल्लेख नहीं करने के लिए जो मैं पहले से ही बैश में आराम से हूं। लेकिन कम से कम मैंने अपने पहले अजगर स्क्रिप्ट को Google के gmail.com से सब कुछ चूसने के लिए लिनक्स फ्लैट फाइल में लिखा है? :)
विनयुनुच्स

5

मन [[और ":

[[ $a == z* ]]   # True if $a starts with an "z" (pattern matching).
[[ $a == "z*" ]] # True if $a is equal to z* (literal matching).

[ $a == z* ]     # File globbing and word splitting take place.
[ "$a" == "z*" ] # True if $a is equal to z* (literal matching).

तो जैसा कि @glenn_jackman ने कहा, लेकिन दिमाग है कि अगर आप पूरे दूसरे शब्द को दोहरे उद्धरण चिह्नों में लपेटते हैं, तो यह परीक्षण को शाब्दिक मिलान पर बदल देगा ।

स्रोत: http://tldp.org/LDP/abs/html/comparison-ops.html


4

एडविन के जवाब के समान, लेकिन पॉज़िक्स और क्श के लिए बेहतर पोर्टेबिलिटी के साथ, और रिचर्ड की तुलना में एक कम शोर।

substring=ab

string=abc
if [ "$string" != "${string%$substring*}" ]; then
    echo "$substring IS in $string"
else
    echo "$substring is NOT in $string"
fi

string=bcd
if [ "$string" != "${string%$substring*}" ]; then
    echo "$string contains $substring"
else
    echo "$string does NOT contain $substring"
fi

आउटपुट:

abc contains ab
bcd does NOT contain ab
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.