কোনও স্ট্রিং ব্যাশের মধ্যে অন্যটির স্ট্রস্ট্রিং কিনা তা কীভাবে নির্ধারণ করবেন?


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
Duh! এর শুরুতে প্রতিধ্বনি ঠিক ছিল! এক্সডি
এডউইন

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"! = "-এক্সএক্স: + ইউজকম্প্রেসড ওপস" ]]; তারপরে JAVA_OPTS = "$ JAVA_OPTS -XX: + UseCompressedOops" রফতানি করুন; ফাই
মাইক স্লিন

10

নিম্নলিখিত দুটি পন্থা কেবল ব্যাশে নয়, কোনও পসিক্স-সামঞ্জস্যপূর্ণ পরিবেশে কাজ করবে:

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

$ 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

@ WinEunuuchs2 ইউনিক্স ব্যাশে এটি করতে যাচ্ছেন?
সের্গেই কোলোডিয়াজনি

হ্যাঁ এবং না, আমি একটি ফ্রাঙ্কেনস্টেইন প্রকল্প করছি যেখানে পাইথনটি সমস্ত gmail.com বার্তাগুলি মেটাডেটা পেয়েছে এবং এটিকে পার্স করে এবং ড্রিল ডাউন করে একটি জিইউআই তালিকা উপস্থাপন করে। : আমি উত্তর এখানে যদিও পাওয়া stackoverflow.com/questions/5031764/...
WinEunuuchs2Unix

@ WinEunuuchs2 ইউনিক্স ঠিক আছে। আকর্ষণীয় মনে হচ্ছে। আমি ব্যক্তিগতভাবে পাইথনের সমস্ত কিছু পার্স করা পছন্দ করি। এটি কেবলমাত্র বাশের চেয়ে পাঠ্য প্রক্রিয়াকরণের জন্য আরও অনেক বেশি ক্ষমতা রাখে।
সের্গেই কোলোডিয়াজনি

আমি প্রায় দুই বছর আপনার পছন্দগুলি জানি এবং আমি তাদের সম্মান করি। তবে আমি কেবল পাইথন শিখছি এবং এর মধ্যে কাজ করার জন্য ইয়াদ পাওয়া আমার কাছে জটিল মনে হচ্ছে। ব্যাশে আমি ইতিমধ্যে স্বাচ্ছন্দ্যযুক্ত এমন সমস্ত অ্যারের প্রসেসিংয়ের উল্লেখ না করে। তবে কমপক্ষে আমি আমার প্রথম অজগর স্ক্রিপ্ট লিখেছিলাম গুগলের gmail.com থেকে সবকিছু লিনাক্স ফ্ল্যাট ফাইলটিতে স্তন্যপান করতে? :)
WinEunuuchs2Unix

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/compistance-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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.