যুক্তি হল যে আমার স্ক্রিপ্ট পায় এক নিম্নলিখিত বিন্যাসে একটি তারিখ: yyyymmdd
।
আমি ইনপুট হিসাবে কোনও বৈধ তারিখ পাই কিনা তা আমি খতিয়ে দেখতে চাই।
কিভাবে আমি এটি করতে পারব? আমি একটি রেজেক্স ব্যবহার করার চেষ্টা করছি:[0-9]\{\8}
যুক্তি হল যে আমার স্ক্রিপ্ট পায় এক নিম্নলিখিত বিন্যাসে একটি তারিখ: yyyymmdd
।
আমি ইনপুট হিসাবে কোনও বৈধ তারিখ পাই কিনা তা আমি খতিয়ে দেখতে চাই।
কিভাবে আমি এটি করতে পারব? আমি একটি রেজেক্স ব্যবহার করার চেষ্টা করছি:[0-9]\{\8}
উত্তর:
আপনি পরীক্ষার নির্মাণ ব্যবহার করতে পারেন, [[ ]]
=~
স্ট্রিংটি একটি রেজেক্স প্যাটার্নের সাথে মেলে কিনা তা পরীক্ষা করার জন্য নিয়মিত এক্সপ্রেশন ম্যাচ অপারেটরের সাথে ।
আপনার নির্দিষ্ট ক্ষেত্রে, আপনি লিখতে পারেন:
[[ $date =~ ^[0-9]{8}$ ]] && echo "yes"
বা আরও একটি সঠিক পরীক্ষা:
[[ $date =~ ^[0-9]{4}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])$ ]] && echo "yes"
# |^^^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^ ^^^^^^^^^^ ^^^^^^ |
# | | ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ |
# | | | | |
# | | \ | |
# | --year-- --month-- --day-- |
# | either 01...09 either 01..09 end of line
# start of line or 10,11,12 or 10..29
# or 30, 31
এটি হ'ল, আপনি যে ফর্ম্যাটটি চান তার সাথে মিলে বাশের একটি রেজেক্স নির্ধারণ করতে পারেন can এইভাবে আপনি করতে পারেন:
[[ $date =~ ^regex$ ]] && echo "matched" || echo "did not match"
যেখানে কমান্ড পরে &&
পরীক্ষা সফল ||
হলে কমান্ডগুলি কার্যকর করা হয় এবং পরীক্ষাটি ব্যর্থ হলে কমান্ডগুলি কার্যকর করা হয়।
দ্রষ্টব্য এটি বাশ-এ ব্যবহারকারী ইনপুট তারিখের ফর্ম্যাট যাচাইকরণে আলেকস-ড্যানিয়েল জাকিমেনকোর সমাধানের ভিত্তিতে ।
অন্যান্য শেলগুলিতে আপনি গ্রেপ ব্যবহার করতে পারেন । যদি আপনার শেলটি পসিক্স অনুগত হয় তবে করুন
(echo "$date" | grep -Eq ^regex$) && echo "matched" || echo "did not match"
ইন মাছ , যা POSIX-অনুবর্তী নয়, আপনি কি করতে পারেন
echo "$date" | grep -Eq "^regex\$"; and echo "matched"; or echo "did not match"
grep
সহ কিছু কমান্ডের চেয়ে সহজেই রেগেক্সের জন্য ব্যাশ সিনট্যাক্সটি বুঝতে পারবেন -E
।
sh
, fish
বা অন্যান্য কম সজ্জিত শাঁস।
বাশ সংস্করণ 3 এ আপনি '= ~' অপারেটরটি ব্যবহার করতে পারেন:
if [[ "$date" =~ ^[0-9]{8}$ ]]; then
echo "Valid date"
else
echo "Invalid date"
fi
তথ্যসূত্র: http://tldp.org/LDP/abs/html/bashver3.html#REGEXMATCHREF
দ্রষ্টব্য: ডাবল বন্ধনীগুলির মধ্যে ম্যাচিং অপারেটরের উদ্ধৃতি, [[]], বাশ সংস্করণ ৩.২ অনুসারে আর প্রয়োজন নেই
স্ট্রিং সঠিক তারিখ কিনা তা পরীক্ষা করার একটি ভাল উপায় হ'ল কমান্ডের তারিখটি ব্যবহার করা:
if date -d "${DATE}" >/dev/null 2>&1
then
# do what you need to do with your date
else
echo "${DATE} incorrect date" >&2
exit 1
fi
মন্তব্য থেকে: কেউ ফর্ম্যাটিং ব্যবহার করতে পারেন
if [ "2017-01-14" == $(date -d "2017-01-14" '+%Y-%m-%d') ]
date -d 2017-11-14e
এটি করি মঙ্গল নভেম্বর 14 05:00:00 ইউটিসি 2017 প্রদান করে তবে এটি আমার স্ক্রিপ্টটি ভেঙে দেবে।
আমি এর expr match
পরিবর্তে ব্যবহার করব =~
:
expr match "$date" "[0-9]\{8\}" >/dev/null && echo yes
এটি বর্তমানে ব্যবহারের গ্রহণযোগ্য উত্তরের চেয়ে ভাল =~
কারণ =~
খালি স্ট্রিংগুলির সাথেও মিলবে, যা এটি করা উচিত নয়। ধরুন badvar
সংজ্ঞায়িত না করা হয়েছে, তারপরে [[ "1234" =~ "$badvar" ]]; echo $?
(ভুলভাবে) দেওয়া হয়েছে 0
, যখন expr match "1234" "$badvar" >/dev/null ; echo $?
সঠিক ফলাফল দেয় 1
।
আমরা ব্যবহার করতে হবে >/dev/null
লুকিয়ে রাখবেন তা expr match
এর আউটপুট মান , যা অক্ষরের সংখ্যা সাথে মিল পাওয়া গেছে অথবা 0 যদি কোনো মিল পাওয়া যায়নি। নোট করুন এর আউটপুট মানটি তার প্রস্থান স্থিতি থেকে আলাদা । কোনও মিল খুঁজে পাওয়া গেলে প্রস্থান স্থিতি 0 বা অন্যথায় 1 হয়।
সাধারণত, এর বাক্য গঠনটি expr
হ'ল:
expr match "$string" "$lead"
বা:
expr "$string" : "$lead"
যেখানে $lead
নিয়মিত প্রকাশ হয়। এটি exit status
যদি সত্য হয় (0) তবে lead
শীর্ষস্থানীয় স্লাইসের সাথে মেলে string
(এর কোনও নাম আছে?)। উদাহরণস্বরূপ expr match "abcdefghi" "abc"
প্রস্থান করে true
তবে বের expr match "abcdefghi" "bcd"
হয় false
। (এটি দেখানোর জন্য @ কার্লো উডের ক্রেডিট।
=~
খালি স্ট্রিংয়ের সাথে মেলে না, আপনি যে উদাহরণটি দিয়েছেন তাতে খালি প্যাটার্নের সাথে আপনি একটি স্ট্রিং মেলাচ্ছেন । বাক্য গঠনটি হ'ল string =~ pattern
, এবং একটি খালি প্যাটার্ন সবকিছুর সাথে মেলে।
expr match "abcdefghi" "^" && echo Matched || echo No match
- এবং expr match "abcdefghi" "bcd" && echo Matched || echo No match
- উভয়ই ফিরে আসে "0\nNo match"
। যেখানে ম্যাচিং "a.*f"
ফিরে আসবে "6\nMatched"
। আপনার উদাহরণে '^' এর ব্যবহার অতএব অপ্রয়োজনীয় এবং ইতিমধ্যে জড়িত।
=~
খালি স্ট্রিংয়ের সাথে মেলে আচরণের যৌক্তিকাকে বিবেচনা করতে পারে কিনা । এটি এই আচরণটি অপ্রত্যাশিত এবং ত্রুটির কারণ হতে পারে। আমি এই উত্তরটি বিশেষভাবে লিখেছিলাম কারণ এটি দ্বারা আমি পুড়ে গিয়েছিলাম।
expr
আমার সাথে একমত হয়েছেন।
যেখানে একটি রেজেক্সের ব্যবহার কোনও তারিখের চরিত্রের ক্রমটি সঠিক কিনা তা নির্ধারণ করতে সহায়ক হতে পারে, তবে তারিখটি বৈধ কিনা তা নির্ধারণ করার জন্য এটি সহজে ব্যবহার করা যায় না। নিম্নলিখিত উদাহরণগুলি নিয়মিত অভিব্যক্তিটি পাস করবে তবে সমস্ত অবৈধ তারিখগুলি: 20180231, 20190229, 20190431
সুতরাং যদি আপনার তারিখের স্ট্রিংটি (আসুন এটি কল করুন datestr
) সঠিক ফর্ম্যাটে থাকে তবে আপনি যদি যাচাই করতে চান তবে এটি দিয়ে পার্স করা ভাল withdate
এবং date
স্ট্রিংটিকে সঠিক ফর্ম্যাটে রূপান্তর । যদি উভয় স্ট্রিং অভিন্ন হয় তবে আপনার বৈধ বিন্যাস এবং বৈধ তারিখ রয়েছে।
if [[ "$datestr" == $(date -d "$datestr" "+%Y%m%d" 2>/dev/null) ]]; then
echo "Valid date"
else
echo "Invalid date"
fi