বাশ = ge রেজেক্স এবং https://regex101.com/


12

Https://regex101.com/ ব্যবহার করে আমি একটি স্ট্রিংয়ে কোনও আইপি ঠিকানার প্রথম উপস্থিতিটি ফেরত দিতে একটি নিয়মিত এক্সপ্রেশন তৈরি করেছি।

RegExp:

(?:\d{1,3}\.)+(?:\d{1,3})

ডিলিমিটার সহ রেজিপ্যাক্স:

/(?:\d{1,3}\.)+(?:\d{1,3})/

নিম্নলিখিত পরীক্ষার স্ট্রিং সহ:

eu-west                       140.243.64.99 

এটি একটি সম্পূর্ণ ম্যাচ ফেরত:

140.243.64.99

আমি অ্যাঙ্করগুলি ইত্যাদির সাথে যা চেষ্টা করি তা বিবেচনা না করেই, নিম্নলিখিত ব্যাশ স্ক্রিপ্টটি নিয়মিত প্রকাশিত এক্সপ্রেশন নিয়ে কাজ করবে না।

temp="eu-west                       140.243.64.99            "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
  echo "found a match"
else
  echo "No IP address returned"
fi

3
এটি আমার কাছে পার্লের নিয়মিত অভিব্যক্তির মতো দেখাচ্ছে। বাশ তা সমর্থন করে না।
কুসালানন্দ

1
=~অপারেটর আলোচনা করা হয় ম্যানুয়াল এখানে যেখানে এটি ব্যাশ ব্যবহার করে "বর্ধিত রেগুলার এক্সপ্রেশনের" লেখা নয়। প্রসারিত রেজিক্সগুলি regex(7)ম্যান পৃষ্ঠাতে বর্ণনা করা হয়েছে এবং সংক্ষিপ্তভাবে এখানে সংক্ষেপে বলা হয়েছে
গ্লেন জ্যাকম্যান

উত্তর:


15

\d"কোনও অঙ্ক" বলার জন্য এটি একটি মানহীন উপায়। আমি মনে করি এটি পার্ল থেকে এসেছে এবং প্রচুর অন্যান্য ভাষা এবং ইউটিলিটিগুলি পার্ল-সামঞ্জস্যপূর্ণ আরইএস (পিসিআরই) সমর্থন করে। (এবং উদাহরণস্বরূপ ডিবিয়ান প্রসারিত জিএনইউ গ্রেপ ২.২27 \wএমনকি সাধারণ মোডে এমনকি শব্দের অক্ষরের জন্য একইরকম সমর্থন করে ))

বাশ সমর্থন করে না \d, যদিও আপনাকে স্পষ্টভাবে ব্যবহার করা [0-9]বা ব্যবহার করতে হবে [[:digit:]]। নন-ক্যাপচারিং গ্রুপের জন্য একই (?:..), কেবল (..)পরিবর্তে ব্যবহার করুন।

এটি মুদ্রণ করা উচিত match:

temp="eu-west                       140.243.64.99            "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match

2
আপনার জিএনইউ ছাড়া কি grepসমর্থন করে ? \d-P
স্টাফেন চেজেলাস

@ স্টাফেনচাজেলাস, ওহ, অবশ্যই না। এটি সমর্থন করে \wএবং \bযা আমি পার্লের কাছ থেকে শিখেছি তাই আমি বিভ্রান্ত হয়ে পড়েছি।
ilkkachu

1
এটি বলা ঠিক নয় \dবা পিসিআরই "মানহীন"। এগুলি বেশ সাধারণ, মূল নিয়মিত এক্সপ্রেশন এবং প্রসারিত নিয়মিত এক্সপ্রেশন থেকে কেবল আলাদা স্ট্যান্ডার্ড।
ড্যানিয়েল ফারেল

1
@ ড্যানিয়েলফ্যারেল, এই ক্ষেত্রে মানটি পসিক্স নির্দিষ্ট করে এবং এটি সম্পর্কে জানে না \d। যদিও আপনি ঠিক সেই পিসিআরই তে ঠিক স্ট্যান্ডার্ড বা স্বল্প সংজ্ঞায়িত। বিরক্তিকর সমস্যা গনুহ, grep (অথবা জন্য glibc) সমর্থন করে কিছু PCRE মত পরমাণু অন্তত হয় \wএবং \sere ব্যাখ্যা যখন, এবং যে প্রেক্ষাপটে তারা খুব হয় নন-স্ট্যান্ডার্ড। আমার ফ্রেসিংগুলি এর থেকে আংশিকভাবে আসতে পারে এবং \dএকইভাবে জিএনইউ-সমর্থিত ভুল বিবরণ।
ইলক্কাছু

4

(:...)এবং \dপার্ল বা পিসিআরই নিয়মিত এক্সপ্রেশন অপারেটরগুলি (জিএনইউ-র মতো grep -P)।

bashকেবল বর্ধিত নিয়মিত অভিব্যক্তি সমর্থন করে কেবলমাত্র grep -Eরেগেক্সপ্সের জন্য আক্ষরিক অর্থে উত্তীর্ণ [[ text =~ regexp-here ]]হওয়ার সাথে সাথে অযোগ্য বিস্তারের ফলাফল হিসাবে ( [[ text =~ $var ]]বা হিসাবে [[ test =~ $(printf '%s\n' 'regexp-here') ]]), এটি পসিক্স এক্সটেন্ডেড নিয়মিত এক্সপ্রেশন বৈশিষ্ট্য সেটটিতে সীমাবদ্ধ।

এমনকি এমন সিস্টেমেও যেখানে grep -E '\d'কাজ করবে (জিএনইউ ইআরইগুলি ইতিমধ্যে পার্ল রেজেক্সপগুলি থেকে কিছু এক্সটেনশন আমদানি \sকরেছে \dযেমন ভবিষ্যতের সংস্করণগুলিও থাকতে পারে ), আপনাকে ব্যবহার করতে হবে:

regexp='\d'
[[ $text =~ $regexp ]]

মধ্যে bashএটি কাজ জন্য ( [[ $text =~ \d ]]না হবে)।

পিসিআরই সমর্থন করে এমন শেলের জন্য, আপনি এর zshপরিবর্তে ব্যবহার করতে পারেন :

set -o rematchpcre
[[ $text =~ '(?:\d{1,3}\.)+(?:\d{1,3})' ]]

ksh93 এর নিজস্ব প্যাটার্ন মিলের অংশ হিসাবে পার্ল-জাতীয় নিয়মিত এক্সপ্রেশনগুলি (সম্পূর্ণ সুসংগত নয়) এর নিজস্ব প্রয়োগকে সমর্থন করে। সেখানে, আপনি ব্যবহার করবেন:

regexp='~(P)(?:\d{1,3}\.)+(?:\d{1,3})'
[[ $text = $regexp ]]

( =পরিবর্তে নোট করুন =~। আপনি অস্থায়ী ভেরিয়েবলগুলি ব্যবহার করতে চাইবেন যেহেতু এটি যখন খুব বগি না হয়)


1

সাইট regex101.com পিসিআরই ব্যবহার করে (উপরের বাম কোণে দেখুন) ডিফল্ট হিসাবে এবং এটিতে "বর্ধিত" রেজেক্স সিনট্যাক্সের সমর্থন নেই। এটি হ'ল পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশনস ", যা পার্ল থেকে আসে (প্রত্যাশার পক্ষে যুক্তিযুক্ত)।

পিসিআরই grep -Pকিছু শর্তের অধীনে কিছু সরঞ্জাম (যেমন ) দ্বারা সমর্থিত তবে [[…]]আইডিয়ামের অভ্যন্তরে ব্যাশ রেজেক্স সহায়তা কেবল বর্ধিত রেজেক্স (লাইক grep -E) এর জন্য।

এক্সটেন্ডেড রেজেক্সে, নন-ক্যাপচার প্রথম (?…)বন্ধনী উপস্থিত নেই এবং \ d এছাড়াও অনুপস্থিত। আপনার সহজ (…)এবং [0-9]:

regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.