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


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.