আপনি যদি ব্যাশ ব্যবহার করছেন তবে আপনাকে ব্যবহার করতে হবে না grep
:
files="*.jpg"
regex="[0-9]+_([a-z]+)_[0-9a-z]*"
for f in $files # unquoted in order to allow the glob to expand
do
if [[ $f =~ $regex ]]
then
name="${BASH_REMATCH[1]}"
echo "${name}.jpg" # concatenate strings
name="${name}.jpg" # same thing stored in a variable
else
echo "$f doesn't match" >&2 # this could get noisy if there are a lot of non-matching files
fi
done
একটি পরিবর্তনশীল মধ্যে regex রাখা ভাল। আক্ষরিকভাবে অন্তর্ভুক্ত করা হলে কিছু নিদর্শন কাজ করবে না।
এটি =~
যা ব্যাশের রেজেক্স ম্যাচ অপারেটর তা ব্যবহার করে। ম্যাচের ফলাফলগুলি বলা একটি অ্যারেতে সংরক্ষণ করা হয় $BASH_REMATCH
। প্রথম ক্যাপচার গ্রুপটি সূচী 1, দ্বিতীয় (যদি থাকে) 2 তে সূচিত হয়, ইত্যাদি সূচক শূন্য পুরো ম্যাচ।
আপনার সচেতন হওয়া উচিত যে অ্যাঙ্করগুলি ছাড়াই এই রেজেেক্স (এবং যেটি ব্যবহার করছেন grep
) নীচের উদাহরণগুলির সাথে আরও কয়েকটি মিলে যাবে, যা আপনি যা খুঁজছেন তা নাও হতে পারে:
123_abc_d4e5
xyz123_abc_d4e5
123_abc_d4e5.xyz
xyz123_abc_d4e5.xyz
দ্বিতীয় এবং চতুর্থ উদাহরণগুলি মুছে ফেলার জন্য আপনার রেজেেক্সটিকে এটির মতো করুন:
^[0-9]+_([a-z]+)_[0-9a-z]*
যা বলে যে স্ট্রিংটি অবশ্যই এক বা একাধিক অঙ্ক দিয়ে শুরু করা উচিত । ক্যারেট স্ট্রিংয়ের শুরুতে প্রতিনিধিত্ব করে। আপনি যদি রেগেক্সের শেষে ডলারের চিহ্নটি যুক্ত করেন তবে এটির মতো:
^[0-9]+_([a-z]+)_[0-9a-z]*$
এরপরে তৃতীয় উদাহরণটিও মুছে ফেলা হবে যেহেতু বিন্দুটি রেজেক্সের বর্ণগুলির মধ্যে নেই এবং ডলার চিহ্নটি স্ট্রিংয়ের শেষটিকে উপস্থাপন করে। নোট করুন যে চতুর্থ উদাহরণটিও এই ম্যাচটিকে ব্যর্থ করে।
আপনার যদি জিএনইউ থাকে grep
(প্রায় 2.5 বা তার বেশি পরে, আমি মনে করি, যখন \K
অপারেটর যুক্ত হয়েছিল):
name=$(echo "$f" | grep -Po '(?i)[0-9]+_\K[a-z]+(?=_[0-9a-z]*)').jpg
\K
অপারেটর (পরিবর্তনশীল দৈর্ঘ্যের বর্ণন-পিছনে) ম্যাচ পূর্ববর্তী প্যাটার্ন সৃষ্টি করে কিন্তু ফলাফলে ম্যাচ অন্তর্ভুক্ত নয়। স্থির দৈর্ঘ্যের সমতুল্য (?<=)
- সমাপ্তি বন্ধনীর আগে প্যাটার্নটি অন্তর্ভুক্ত করা হবে। আপনি ব্যবহার করতে হবে \K
যদি quantifiers বিভিন্ন লেন্থ এর স্ট্রিং মেলে পারে (যেমন +
, *
, {2,4}
)।
(?=)
অপারেটর ম্যাচ নির্দিষ্ট অথবা পরিবর্তনশীল দৈর্ঘ্যের নিদর্শন এবং "চেহারা সম্মতি" বলা হয়। এটি ফলাফলের সাথে মিলে যাওয়া স্ট্রিংও অন্তর্ভুক্ত করে না।
ম্যাচ কেস-সংবেদনশীল করার জন্য, (?i)
অপারেটরটি ব্যবহৃত হয়। এটি অনুসরণ করে এমন নিদর্শনগুলিকে প্রভাবিত করে যাতে এর অবস্থানটি উল্লেখযোগ্য।
ফাইলনামে অন্যান্য অক্ষর রয়েছে কিনা তার উপর নির্ভর করে রেজেক্সকে সামঞ্জস্য করা দরকার হতে পারে। আপনি নোট করবেন যে এই ক্ষেত্রে, আমি একই সাথে স্ট্রিংটি ক্যাপচার করা হয়েছে তার সাথে স্ট্রিংকে কাটানোর উদাহরণ দেখাব।