বাশ স্ক্রিপ্টে একটি প্যাটার্ন অনুসারে একটি স্ট্রিং উত্তোলন


17

ব্যাশে, ধরুন আমার কাছে একটি স্ট্রিং রয়েছে strname:

strname="ph7go04325r"

আমি প্রথম "3" অক্ষর এবং শেষ "r" অক্ষরের মধ্যে অক্ষরগুলি বের করতে চাই strname, ফলাফলটি স্ট্রিংয়ে সংরক্ষণ করি strresult। উপরের উদাহরণে, ফলাফলটি strresultহবে:

strresult="25"

প্রথম "3"অক্ষর অগত্যা 8 ইঞ্চি স্ট্রিং পজিশনে নয়strname ; একইভাবে গত "r"হয় না অগত্যা স্ট্রিং অবস্থানে 11. সুতরাং, নিম্নলিখিত স্ট্রিং উভয় strnameউত্পাদ উচিত strresult="25":

strname="ph11go04325raa"
strname="325r"
strname="rgo04325raa"

এছাড়াও, strname=ph12go04330raa"ফলন করা উচিত strresult="30"।

আমি স্ক্রিপ্টিং-কে বাশ করতে নতুন এবং আমি জানি না কোথায় স্ট্রিং প্যাটার্নটি এই জাতীয়ভাবে মিলবে। তোমার কি কোন মতামত আছে?

উত্তর:


28

এটি সম্পন্ন করতে আপনি ব্যাশে একটি রেজেক্স ব্যবহার করতে পারেন (3.0 বা তার বেশি):

if [[ $strname =~ 3(.+)r ]]; then
    strresult=${BASH_REMATCH[1]}
else
    echo "unable to parse string $strname"
fi

ব্যাশে, একটি রেজেক্স থেকে ক্যাপচার গ্রুপগুলি বিশেষ অ্যারেতে স্থাপন করা হয় BASH_REMATCH। এলিমেন্ট 0 পুরো ম্যাচটি ধারণ করে এবং 1 টি প্রথম ক্যাপচার গ্রুপের সাথে ম্যাচটি অন্তর্ভুক্ত করে।


10

স্ট্যান্ডার্ড shসিনট্যাক্সে (সুতরাং কোনও সংস্করণ bashবা অন্য কোনও পসিক্স কমপ্লায়েন্ট শেলের সাথে কাজ করবে), আপনি এটি করবেন:

case $strname in
  (*3*r*) 
    strresult=${strname#*3}
    strresult=${strresult%r*};;
  (*)
    printf >&2 '%s\n' "Unable to parse string $strname"
esac

পুরানো exprসমাধানটি দেখুন যা এমনকি 35 বছরের পুরানো ইউনিটগুলিতেও কাজ করবে:

expr "x$strname" : 'x[^3]*3\(.*\)r'

পুরাতন ছল সঙ্গে exprযে যদি ম্যাচ ব্যর্থ আপনি একটি নন-জিরো প্রস্থান স্থিতি (জরিমানা) হয় তবে আপনার কাছে (সঙ্গে মত যদি ফিরে স্ট্রিং সমাধান করা 0 একটি নন-জিরো প্রস্থান অবস্থা strname=zz300rzz)।


আমি মনে করি আপনার শব্দবন্ধগুলি ভুলভাবে বোঝায় যে এটি কেবল বাশনের পুরানো সংস্করণগুলি দিয়েই করা যায়। প্যারামিটারের সম্প্রসারণ অবশ্যই আধুনিক শেলগুলিতে এখনও একটি সূক্ষ্ম পদ্ধতির।
— কোজিরো

1
@ কোজিরো, আমি আপনার বোঝাতে চাইছি প্রাথমিক সূত্রটি ছিল জর্ডানের উত্তরে অনুসরণ করা। আমি আমার উত্তর আপডেট করেছি।
— স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.