#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
~
প্রারম্ভিক নিয়মিত ভাব প্রকাশের ক্ষেত্রে নেতৃস্থানীয়রা কী করে ?
#!/bin/bash
INT=-5
if [[ "$INT" =~ ^-?[0-9]+$ ]]; then
echo "INT is an integer."
else
echo "INT is not an integer." >&2
exit 1
fi
~
প্রারম্ভিক নিয়মিত ভাব প্রকাশের ক্ষেত্রে নেতৃস্থানীয়রা কী করে ?
উত্তর:
~
আসলে অপারেটর অংশ =~
যা তার স্ট্রিং তার ডান দিকে বর্ধিত রেগুলার এক্সপ্রেশন বামে একটি রেগুলার এক্সপ্রেশন ম্যাচ সম্পাদন করে।
[[ "string" =~ pattern ]]
নোট করুন যে স্ট্রিংটি উদ্ধৃত করা উচিত এবং নিয়মিত প্রকাশটি উদ্ধৃত করা উচিত নয়।
পার্ল প্রোগ্রামিং ভাষায় অনুরূপ অপারেটর ব্যবহার করা হয়।
নিয়মিত এক্সপ্রেশনগুলি বোঝে bash
যা জিএনইউ পতাকাটির grep
সাথে বোঝে ঠিক একই রকম -E
, নিয়মিত এক্সপ্রেশনগুলির বর্ধিত সেট।
কিছুটা অফ-টপিক, তবে জানা ভাল:
ক্যাপচারিং গ্রুপগুলি সহ একটি নিয়মিত প্রকাশের সাথে মিলে গেলে প্রতিটি গ্রুপ দ্বারা ক্যাপচার স্ট্রিংয়ের অংশটি BASH_REMATCH
অ্যারেতে উপলব্ধ । Zeroth / প্রথম এই অ্যারের অনুরূপ করা এন্ট্রি &
প্রতিস্থাপন প্যাটার্ন sed
এর প্রতিকল্পন কমান্ড (অথবা $&
পার্ল মধ্যে), যা স্ট্রিং, যাতে ধরণের সাথে মেলা বিট, যখন সূচক 1 এন্ট্রি এবং অগ্রে অনুরূপ \1
, \2
ইত্যাদি । একটি sed
প্রতিস্থাপন প্যাটার্ন (অথবা $1
, $2
ইত্যাদি পার্ল মধ্যে), অর্থাত্ বিট প্রতিটি প্রথম বন্ধনী দ্বারা মিলেছে।
উদাহরণ:
string=$( date +%T )
if [[ "$string" =~ ^([0-9][0-9]):([0-9][0-9]):([0-9][0-9])$ ]]; then
printf 'Got %s, %s and %s\n' \
"${BASH_REMATCH[1]}" "${BASH_REMATCH[2]}" "${BASH_REMATCH[3]}"
fi
এটি আউটপুট হতে পারে
Got 09, 19 and 14
বর্তমান সময়টি যদি হয় 09:19:14।
REMATCH
বিট BASH_REMATCH
অ্যারে নাম "রেগুলার এক্সপ্রেশন হিসেবে" অর্থাৎ "পুনরায় ম্যাচ" থেকে আসে।
অ bash
-বোর্ন-জাতীয় শেলগুলিতে, কেউ expr
সীমাবদ্ধ নিয়মিত প্রকাশের মিলের জন্যও ব্যবহার করতে পারেন (কেবলমাত্র বেসিক নিয়মিত অভিব্যক্তি ব্যবহার করে)।
একটি ছোট উদাহরণ:
$ string="hello 123 world"
$ expr "$string" : ".*[^0-9]\([0-9][0-9]*\)"
123
grep -E
কেবলমাত্র জিএনইউ সিস্টেমে যা বোঝে এবং কেবল প্যাটার্ন হিসাবে ভেরিয়েবল ব্যবহার না করে [[ $var = $pattern ]]
( [[ 'a b' =~ a\sb ]]
বনাম দেখুন p='a\sb'; [[ 'a b' =~ $p ]]
) তার সমান । এছাড়াও সাবধান থাকুন যে শেল উদ্ধৃতি আরআর অপারেটরদের অর্থকে প্রভাবিত করে এবং শেল টোকেনাইজিংয়ের জন্য কিছু অক্ষর উদ্ধৃত করা দরকার যা আরই প্রক্রিয়াজাতকরণকে প্রভাবিত করতে পারে। [[ '\' =~ [\/] ]]
মিথ্যা প্রত্যাবর্তন ksh93
আরও খারাপ সমস্যা আছে। zsh
স্যানার পদ্ধতির জন্য (বা বাশ ৩.১) দেখুন যেখানে শেল এবং আরই উদ্ধৃতি স্পষ্টভাবে পৃথক। [
এর builtin zsh
এবং yash
একটি আছে =~
অপারেটর।
off-topic
! +1 (
[[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]
। বা যে একটি উদ্ধৃত *
মেলে? [[ "This is a fine mess." =~ "T.........fin*es*" ]]
।
[[ a =~ .* ]]
বা [[ a =~ '.*' ]]
বা [[ a =~ \.\* ]]
, একই .*
পুনঃ পাস করা হয়েছে =~
অপারেটর। OTH, ইন bash
, [[ '\' =~ [)] ]]
আয় একটি ত্রুটি, আপনি এটি কিনা চেষ্টা ছাড়া জানতে চাই [[ '\' =~ [\)] ]]
ম্যাচ? কীভাবে [[ '\' =~ [\/] ]]
(এটি ksh93 এ করে)। কীভাবে c='a-z'; [[ a =~ ["$c"] ]]
( =
অপারেটরের সাথে তুলনা )? আরও দেখুন: [[ '\' =~ [^]"."] ]]
যা ফেরৎ মিথ্যা ... লক্ষ্য করুন আপনি কি করতে পারেন shopt -s compat31
মধ্যে bash
পেতে zsh
আচরণ।
zsh
/ bash -o compat31
এর আচরণও ( সমর্থন করে এমন বাস্তবায়নের জন্য ) বা এর [[ a =~ '.*' ]]
সাথে সামঞ্জস্যপূর্ণ । OTOH, এটা সামঞ্জস্যপূর্ণ নয় সঙ্গে বনাম (কিন্তু তারপর, globs শেল ভাষা অংশ, যখন মাঝামাঝি নয়)। [ a '=~' '.*' ]
[
=~
expr a : '.*'
[[ a = '*' ]]
[[ a = * ]]
[[ expression ]]
বিভাগের অধীনে আপনার বাশ ম্যান পৃষ্ঠাগুলি পড়া উচিত ।
An additional binary operator, =~, is available, with the same precedence as == and !=. When it is used, the string to the right of the operator is considered an extended regular expression and matched accordingly (as in regex(3)).
দীর্ঘ গল্প সংক্ষিপ্ত, =~
একটি অপারেটর, ঠিক যেমন ==
এবং !=
। এটির ডানদিকে স্ট্রিংয়ের আসল রেজেক্সের সাথে কোনও সম্পর্ক নেই।
=~
বাস্তব জীবনের ব্যবহারকে প্রমাণ করে এমন কিছু উদাহরণ কি আপনি বের করতে পারেন ...?
man [[ expresssion ]]
এবং man [[
কিছুই ফেরত না। অভ্যন্তরীণ ব্যাশ কমান্ডের help [[
কারণে দরকারী তথ্য ফেরত [[
দেয় =~
basic তবে মৌলিক বা বর্ধিত রেজেক্স সিনট্যাক্স ব্যবহার করে কিনা তা বলে না । You আপনার উদ্ধৃত পাঠ্যটি ব্যাশ ম্যান পৃষ্ঠা থেকে। আমি বুঝতে পেরেছি যে আপনি "ব্যাশ ম্যান পৃষ্ঠাগুলি পড়ুন" বলেছিলেন তবে প্রথমে, আমি ভেবেছিলাম আপনি ব্যাশের মধ্যে থাকা ম্যান পেজগুলি পড়েন। যে কোনও হারে, man bash
একটি বিশাল ফাইল ফেরত দেয় যা 4139 লাইন (72 পৃষ্ঠা) দীর্ঘ। এটি চেপে অনুসন্ধান করা যেতে পারে /▒▒▒
, যা একটি রেইজেক্স নেয়, যার স্বাদ যেমন =~
— এর মতো specified এটি নির্দিষ্ট নেই।