বাশ পরীক্ষা: "= ~" কি করে?


40
#!/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

~প্রারম্ভিক নিয়মিত ভাব প্রকাশের ক্ষেত্রে নেতৃস্থানীয়রা কী করে ?


3
এটি কোনও রেজেক্স নয়, এটি একটি
রেইজেক্স

5
আপনি কি বাশ ম্যানুয়ালটি পড়েছেন? আপনি কি অস্পষ্ট খুঁজে পান?
আইক্রাস

উত্তর:


46

~আসলে অপারেটর অংশ =~যা তার স্ট্রিং তার ডান দিকে বর্ধিত রেগুলার এক্সপ্রেশন বামে একটি রেগুলার এক্সপ্রেশন ম্যাচ সম্পাদন করে।

[[ "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

2
এটি grep -Eকেবলমাত্র জিএনইউ সিস্টেমে যা বোঝে এবং কেবল প্যাটার্ন হিসাবে ভেরিয়েবল ব্যবহার না করে [[ $var = $pattern ]]( [[ 'a b' =~ a\sb ]]বনাম দেখুন p='a\sb'; [[ 'a b' =~ $p ]]) তার সমান । এছাড়াও সাবধান থাকুন যে শেল উদ্ধৃতি আরআর অপারেটরদের অর্থকে প্রভাবিত করে এবং শেল টোকেনাইজিংয়ের জন্য কিছু অক্ষর উদ্ধৃত করা দরকার যা আরই প্রক্রিয়াজাতকরণকে প্রভাবিত করতে পারে। [[ '\' =~ [\/] ]]মিথ্যা প্রত্যাবর্তন ksh93আরও খারাপ সমস্যা আছে। zshস্যানার পদ্ধতির জন্য (বা বাশ ৩.১) দেখুন যেখানে শেল এবং আরই উদ্ধৃতি স্পষ্টভাবে পৃথক। [এর builtin zshএবং yashএকটি আছে =~অপারেটর।
স্টাফেন চ্যাজেলাস

2
খুব সুন্দর off-topic! +1 (
জাজাও

@ স্টাফেনচাজেলাজ এই দুটি স্নাতকের সাথে zsh এ কীভাবে "সানার" আছেন ?: [[ "This is a fine mess." =~ T.........fin*es* ]]; [[ "This is a fine mess." =~ T.........fin\*es\* ]]। বা যে একটি উদ্ধৃত *মেলে? [[ "This is a fine mess." =~ "T.........fin*es*" ]]
sorontar

এটি স্যানার (আইএমও) যা এটি অনেক সহজ নিয়ম। শেল কোটিং এবং আর এ্যাস্কিং স্পষ্টত পৃথক। ইন [[ 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 = * ]]
স্টাফেন চেজেলাস

4

[[ 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)).

দীর্ঘ গল্প সংক্ষিপ্ত, =~একটি অপারেটর, ঠিক যেমন ==এবং !=। এটির ডানদিকে স্ট্রিংয়ের আসল রেজেক্সের সাথে কোনও সম্পর্ক নেই।


=~বাস্তব জীবনের ব্যবহারকে প্রমাণ করে এমন কিছু উদাহরণ কি আপনি বের করতে পারেন ...?
জর্জ ভ্যাসিলিউ

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

@ সোকেল কারও কারও কাছে "আরটিএফএম" করা সমাপ্তের চেয়ে সহজ easier ⋯ man [[ expresssion ]]এবং man [[কিছুই ফেরত না। অভ্যন্তরীণ ব্যাশ কমান্ডের help [[কারণে দরকারী তথ্য ফেরত [[দেয় =~basic তবে মৌলিক বা বর্ধিত রেজেক্স সিনট্যাক্স ব্যবহার করে কিনা তা বলে না । You আপনার উদ্ধৃত পাঠ্যটি ব্যাশ ম্যান পৃষ্ঠা থেকে। আমি বুঝতে পেরেছি যে আপনি "ব্যাশ ম্যান পৃষ্ঠাগুলি পড়ুন" বলেছিলেন তবে প্রথমে, আমি ভেবেছিলাম আপনি ব্যাশের মধ্যে থাকা ম্যান পেজগুলি পড়েন। যে কোনও হারে, man bashএকটি বিশাল ফাইল ফেরত দেয় যা 4139 লাইন (72 পৃষ্ঠা) দীর্ঘ। এটি চেপে অনুসন্ধান করা যেতে পারে /▒▒▒, যা একটি রেইজেক্স নেয়, যার স্বাদ যেমন =~— এর মতো specified এটি নির্দিষ্ট নেই।
অ্যালেক্স কুইন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.