শেল স্ক্রিপ্টে কেস-সংবেদনশীল সাবস্ট্রিং অনুসন্ধান [বন্ধ]


22

আমি কীভাবে শেল স্ক্রিপ্ট লিখতে পারি যা কমান্ড আউটপুটটির ক্ষেত্রে একটি সংবেদনশীল সাবস্ট্রিং ম্যাচ করে?


grep -iহতে পারে?
রমেশ

আমি কীভাবে এটি আমার স্ক্রিপ্টের ভিতরে রাখব? আমি দুঃখিত যদি এই একটি সন্দেহজনক প্রশ্ন হয়। আমি কেবল লিনাক্স অধ্যয়ন করতে শুরু করছি কারণ এটি আমার ইন্টার্নশিপের জন্য প্রয়োজন। ধন্যবাদ!
মিগুয়েল রোক

1
আপনি যা সম্পর্কে জিজ্ঞাসা করছেন তা হ'ল শেল স্ক্রিপ্টিং - "লিনাক্স" কোনও প্রোগ্রামিং ভাষা নয়, এটি একটি অপারেটিং সিস্টেমের কার্নেল। শেল হিসেবে সবচেয়ে বেশি যে লিনাক্স সঙ্গে ব্যবহার করে তা হল bashযার একটি সুপারসেটও হয়, UNIX মানsh । আপনি এর মধ্যে একটি দেখে শুরু করতে পারেন: | 1 | | 2 | - কেবল আসল প্রসঙ্গটি কী তা জানতে পারে।
স্বর্ণলোকস

1
এই প্রশ্নটি এখন বেশ স্পষ্ট বলে মনে হচ্ছে এবং সহায়তা কেন্দ্রের দিকনির্দেশগুলির সাথে মেলে। এটি দয়া করে অন্যের সুবিধার্থে খোলা যেতে পারে?
ববডুলিটল

2
এই প্রশ্নটি কেন পরিষ্কার হচ্ছে না তা আমি अस्पष्ट দেখতে পাচ্ছি না। এটি পরিষ্কার হওয়ার জন্য আমার কী যুক্ত করা উচিত?
মিগুয়েল রোক

উত্তর:


11

প্রথমে এখানে একটি সাধারণ উদাহরণ স্ক্রিপ্ট যা কেসকে উপেক্ষা করে না:

#!/bin/bash
if [ $(echo hello) == hello ]; then
    echo it works
fi

ডানদিকে স্ট্রিং হ্যালো পরিবর্তন করার চেষ্টা করুন এবং এটি আর প্রতিধ্বনিত হওয়া উচিত নয় it worksecho helloআপনার পছন্দের আদেশটি প্রতিস্থাপনের চেষ্টা করুন । আপনি যদি কেসটিকে উপেক্ষা করতে চান এবং স্ট্রিংয়ের মধ্যে একটি লাইন ব্রেক নেই, তবে আপনি গ্রেপ ব্যবহার করতে পারেন:

#!/bin/bash
if echo Hello | grep -iqF hello; then
    echo it works
fi

এখানে কীটি হ'ল আপনি একটি কমান্ড আউটপুটটি পাইপ করছেন grepifএই ক্ষেত্রে, grep মধ্যে - বিবৃতি একটি পাইপলাইন মধ্যে ডানদিকের কমান্ডের প্রস্থান অবস্থা পরীক্ষা। গ্রেপ সাফল্যের সাথে প্রস্থান করে যদি এবং কোনও মিল খুঁজে পায় তবেই।

-i, Grep বিকল্প ক্ষেত্রে উপেক্ষা করার বলছেন। বিকল্প নয় নির্গত আউটপুট এবং প্রথম খেলা শেষে প্রস্থান বলেছেন। বিকল্প একটি রেগুলার এক্সপ্রেশন একটি স্ট্রিং অপেক্ষা বরং যুক্তি চিকিত্সা বলল।
-q
-F

মনে রাখবেন যে প্রথম উদাহরণটি ব্যবহার করে যা সরাসরি তুলনা এবং বিভিন্ন দরকারী অপারেটরকে অনুমতি দেয়। দ্বিতীয় ফর্মটি কেবল আদেশগুলি কার্যকর করে এবং তাদের প্রস্থান স্থিতি পরীক্ষা করে।[ expression ]


আমি বুঝতে পারি না গিলস কেন আমার অবদানের কোডটি পরিবর্তন করার প্রয়োজন মনে করেছিল। তিনি কিছুই ভাঙ্গেনি তবে এটি ঠিক কাজ করেছে। এই উদাহরণে আপনার ডাবল উক্তিগুলির দরকার নেই - তবে আউটপুটে তবে ফাঁকা স্থান রয়েছে সেগুলি গুরুত্বপূর্ণ। এবং == ঠিক পাশাপাশি কাজ করে = কারণ sh আসলে লিনাক্সে বাশ। আসল বোর্ন শেল সময়মতো এই সময়ে চলে গেছে। আমি মনে করি না এমনকি সোলারিসও এটিকে আর চালিয়ে দেয়। এই উদাহরণে অপ্রয়োজনীয় থাকা সত্ত্বেও আমি সম্মত হই যে ডাবল উদ্ধৃতি সম্ভবত একটি সেরা অনুশীলন, তবে কার্যনির্বাহীকরণ এবং তুলনামূলকভাবে পৃথকভাবে রাখার জন্য আমার মতে '==' এটাই।
ববডুলিটল

অপেক্ষা করুন, সুতরাং কেউ কি কোনও পোস্ট সম্পাদনা করতে পারে? আমি যে জানি না।
মিগুয়েল রোক

যথেষ্ট খ্যাতি সহ, হ্যাঁ। আমি আশা করব যে উচ্চ খ্যাতি সম্পন্ন কেউ অনাবশ্যক সম্পাদনা করার আগে বিশেষত এই ফোরামে কোড করার আগে দুবার ভাবেন। unix.stackexchange.com/help/privileges
ববডুলিটল

@ BobDoolittle এটি কিছু ক্ষেত্রে এটি আপনার পার্থক্য তৈরি করে তবে এটি আপনার সেটআপের সাথে নয় - এটি জেনে রাখা ভাল।

2
মনে রাখবেন যে অনুশীলনে, এটি কেবল বোর্ন শেল সম্পর্কে নয়। ==পসিক্স নয়। shনয় bashসব লিনাক্স ভিত্তিক সিস্টেমে। ==দ্বারা সমর্থিত নয় ash(যার উপর shঅনেকগুলি বিএসডি এবং ডেবিয়ান ডেরিভেটিভস অন্তত ভিত্তিক), বা posh, এবং এর উদ্ধৃত প্রয়োজন zsh। দ্বিগুণ করার কোনও মানে নেই =[পরীক্ষার জন্য একটি আদেশ। এখানে অ্যাসাইনমেন্ট এবং তুলনার মধ্যে বিভ্রান্ত করার দরকার নেই। (( a == b ))বনাম মধ্যে এটি ভিন্ন (( a = b))। ব্যবহার ==একটি স্ক্রিপ্ট দিয়ে শুরু হয় #! /bin/shভুল। যদি আপনি ধরে নেন kshবা bashসিনট্যাক্স করেন তবে #!সেই অনুযায়ী আপডেট করুন ।
স্টাফেন চেজেলাস

49

আপনি যদি শেল অপশনটি সেট করেন তবে আপনি bashরেইগেক্স অপারেটরটি ব্যবহার করে স্থানীয়ভাবে কেস-সংবেদনশীল সাবস্ট্রিং মেলাতে =~পারেন nocasematch। উদাহরণ স্বরূপ

s1="hElLo WoRlD"
s2="LO"

shopt -s nocasematch

[[ $s1 =~ $s2 ]] && echo "match" || echo "no match"
match

s1="gOoDbYe WoRlD"
[[ $s1 =~ $s2 ]] && echo "match" || echo "no match"
no match

6
হাঃ হাঃ হাঃ! অস্পষ্ট শেল জ্ঞানের জন্য পয়েন্ট।
ববডুলিটল 29:25 '

2
এই বিকল্পটি সরল ম্যাচ অপারেটরকেও প্রভাবিত করে। [[ XYZ == xyz ]] && echo "match"=>match
itadok

7

ভেরিয়েবলের মান একটি কেস সংবেদনশীল স্ট্রিং সার্চ জন্য needleভেরিয়েবলের মান haystack:

case "$haystack" in
  *"$needle"*) echo "present";
  *) echo "absent";
esac

কেস-সংবেদনশীল স্ট্রিং অনুসন্ধানের জন্য, উভয়কে একই কেসে রূপান্তর করুন।

uc_needle=$(printf %s "$needle" | tr '[:lower:]' '[:upper:]' ; echo .); uc_needle=${uc_needle%.}
uc_haystack=$(printf %s "$haystack" | tr '[:lower:]' '[:upper:]' ; echo .); uc_haystack=${uc_haystack%.}
case "$uc_haystack" in
  *"$uc_needle"*) echo "present";;
  *) echo "absent";;
esac

মনে রাখবেন যে trজিএনইউ কোর্টিলগুলি মাল্টিবাইট লোকেলগুলিকে সমর্থন করে না (যেমন ইউটিএফ -8)। মাল্টিবাইট লোকেলগুলি দিয়ে কাজ করতে, পরিবর্তে ওড়না ব্যবহার করুন। আপনি যদি খালি ব্যবহার করতে চলেছেন তবে আপনি এটিকে স্ট্রিং তুলনা করতে পারেন কেবল রূপান্তর নয়।

if awk 'BEGIN {exit !index(toupper(ARGV[2]), toupper(ARGV[1]))}' "$needle" "$haystack"; then
  echo "present"
else
  echo "absent"
fi

trBusybox থেকে সমর্থন করে না সিনট্যাক্স; আপনি পরিবর্তে ব্যবহার করতে পারেন । ব্যস্তবক্স অ-এএসসিআইআই লোকেলগুলি সমর্থন করে না।[:CLASS:]tr a-z A-Z

ভার্সন (তবে শি নয়) সংস্করণ ৪০++ তে কেস রূপান্তরকরণের জন্য একটি অন্তর্নির্মিত বাক্য গঠন এবং স্ট্রিং মেলানোর জন্য একটি সহজ বাক্য গঠন রয়েছে।

if [[ "${haystack^^}" = *"${needle^^}"* ]]; then
  echo "present"
else
  echo "absent"
esac

আমি বুঝতে পারি এটি কয়েক বছরের পুরনো, তবে এটি printf | trআমার মাথা ঘিরে। যেখানে সম্ভব, আপনার আদেশগুলি কমপক্ষে রাখুন ... একটি ভেরিয়েবল ভি দেওয়া হলে আপনি একই জিনিসটি ব্যবহার করে সম্পন্ন করতে পারেন v=$(tr '[:lower:]' '[:upper:]' <<<$v)। যাঁরা এটি আগে কখনও দেখেননি, তাদের <<<জন্য মূলত এখানে "এখানে পরিবর্তনশীল" যেমন <<EOFহ'ল ডকুমেন্টের ব্যবহার। আপনি একেবারে এটি করতে হবে না printfবা echoনা।
হবে

@ উইল এটি কেবল শেলগুলিতে কাজ করে যার <<<অপারেটর রয়েছে: কেএস, বাশ, জেডএস, তবে সরল sh নয়। এটি printfকীভাবে চলে তার দিক থেকে পাইপিংয়ের খুব কাছাকাছি : এখানে একই সংখ্যক কল রয়েছে forkএবং execve(ধরে নেওয়া যায় যে printfএটি বিল্ট-ইন রয়েছে, যা বেশিরভাগ সাধারণ শেলগুলির ক্ষেত্রে রয়েছে); পার্থক্য হ'ল <<<পাইপ ব্যবহার না করে অস্থায়ী ফাইল তৈরি করা। <<<টাইপ করা সুবিধাজনক তবে পারফরম্যান্সের উন্নতি নয়।
গিলস 21'45
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.