"প্রতিধ্বনি $ x | করার আরও ভাল উপায় সেড… "এবং" প্রতিধ্বনি $ x | গ্রেপ… ”


14

আমি প্রায়শই এটি স্ক্রিপ্টগুলিতে পাই (এবং আমাকে স্বীকার করতে হবে, নিজে এটি লিখতে হবে):

a=$(echo "$x" | sed "s/foo/bar/")

অথবা

if echo "$x" | grep -q foo
then
    ...
fi

কিছু রেজেক্স উপাদান অন্তর্ভুক্ত করতে "foo" বিবেচনা করুন।

আমি মনে করি সেখানে উচিত - এবং সম্ভবত হয় - ফ্রেজ এই, এক দুই কমান্ড এবং একটি নল সঙ্গে যুক্ত নয় কিন্তু আরো কিছু কম্প্যাক্ট অভিব্যক্তি মধ্যে জিনিস গোপন একটি ভাল উপায়।

আমি এটি সন্ধান করতে পারি না। কেহ?


আমি আশা করি অজ্ঞতা (বিকল্পগুলি না জেনে) এবং রক্ষণাবেক্ষণের (বিকল্পগুলি জানার পরেও বোঝার জন্য সহজ হিসাবে এটি বেছে নেওয়ার) সংমিশ্রণের কারণে এই অভিব্যক্তিটি প্রায়শই ব্যবহৃত হয়। আপনার উদাহরণগুলি কী করে তা আমি এক নজরে বলতে পারি, তবে গ্র্যাভিটির এবং ড্যান ম্যাকজির উত্তরগুলির বিকল্পগুলি খুঁজে বের করার জন্য আমার শেল রেফারেন্সের প্রয়োজন।
কোয়াকোট কোয়েসোট

3
যাইহোক, কমান্ড প্রতিস্থাপন করার পছন্দের পদ্ধতিটি $()ব্যাকটিকগুলি না দিয়েই হয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
বিস্তৃতি উদ্ধৃত করাও একটি ভাল ধারণা যাতে সাদা স্থান রক্ষা করা যায়: a="$(echo "$x" | sed "s/foo/bar/")"এবং if echo "$x" | grep foo; …
ক্রিস জনসন 16

$ () বনাম `` সম্পর্কে ভাল মন্তব্য ` আমি দেখি আমার বাশ দক্ষতা এখনও এত দুর্দান্ত নয়।
দেবসোলার

উত্তর:


12

আপনি যদি একটি নির্দিষ্ট শেল না ধরে থাকেন তবে "পাইপ ইকো টু টুল" (বা এক্সপ্রের মতো কেবল একটি "সরঞ্জাম" হিসাবে ) এর চেয়ে ভাল আর কোনও উপায় নেই ; এটা সব আপনি কি সত্যিই সঙ্গে উপর নির্ভর করতে পারেন হয় ঐতিহ্যগত বোর্ন শেল এবং / অথবা POSIX শেল । আপনি যদি অন্যান্য শাঁস বিবেচনা করেন, তবে আরও কিছু বিল্ট-ইন সম্ভাবনা রয়েছে।

ksh আছে

  • অতিরিক্ত প্যাটার্নস: ?(pattern-list), *(pattern-list), {n}(pattern-list), {n,m}(pattern-list), @(pattern-list), !(pattern-list);
  • %P printf, সুনির্দিষ্টভাবে উল্লেখ করা (এবং প্যাটার্ন মধ্যে একটি বর্ধিত রেগুলার এক্সপ্রেশন রূপান্তর করতে %Rপ্যাটার্ন প্রসারিত রেগুলার এক্সপ্রেশন জন্য);
  • expr == patternমধ্যে শর্ত [[ expr ]]পরীক্ষা;
  • ${param/pattern/replacement}পরামিতি সম্প্রসারণ।

বাশ আছে

  • ksh ( extglobঅতিরিক্ত এবং না ) বেশিরভাগ অতিরিক্ত নিদর্শন সক্ষম করার বিকল্প ;{n}{n,m}
  • expr == pattern(ইন শর্ত [[ expr ]]পরীক্ষা);
  • ${param/pattern/replacement}পরামিতি সম্প্রসারণ;
  • (নতুন সংস্করণে) expr =~ extregexpশর্তটি ( [[ expr ]]পরীক্ষাগুলিতে) যা বর্ধিত নিয়মিত প্রকাশের সাথে মেলে
    • প্রথম বন্ধনীযুক্ত subexpressions এবং BASH_REMATCHপরামিতি সঙ্গে, সেড স্টাইল প্রতিস্থাপন করা যেতে পারে।

zsh আছে

  • EXTENDED_GLOBবিকল্পের সাথে এর নিজস্ব বর্ধিত নিদর্শনগুলি ;
  • KSH_GLOBবিকল্প সহ ksh- মত বর্ধিত নিদর্শন ;
  • expr == pattern(ইন শর্ত [[ expr ]]পরীক্ষা);
  • ${pattern/pattern/replacement}পরামিতি সম্প্রসারণ;
  • expr =~ extregexpশর্ত (ইন [[ expr ]]পরীক্ষার) যে বর্ধিত রেগুলার এক্সপ্রেশনের বিরুদ্ধে মেলাতে পারে,
    • যদি RE_MATCH_PCRE বিকল্পটি সেট করা থাকে তবে এটি সরল বর্ধিত নিয়মিত এক্সপ্রেশনগুলির পরিবর্তে PCRE ব্যবহার করতে পারে ,
    • আলাদা subexpressions সঙ্গে MATCHপরামিতি, এবং matchপরামিতি (অথবা BASH_REMATCHসঙ্গে BASH_REMATCHবিকল্প সেট), sed -style প্রতিস্থাপন করা যাবে;
  • যে zsh/pcreমডিউলটি প্রস্তাব করে pcre_compile, pcre_studyএবং pcre_matchআদেশগুলি এবং -pcre-match পরীক্ষার শর্ত ( [[ expr ]]পরীক্ষায়);
  • zsh/regexমডিউল অফার করে -regex-match পরীক্ষা শর্ত (ইন [[ expr ]]পরীক্ষার)।

কি দারুন. এক হিসাবে সম্পূর্ণ হিসাবে ইচ্ছুক পারে। অবশ্যই বিজয়ী।
দেবসোলার

6

সেড লাইনটি প্রতিস্থাপন করতে, এমন কিছু করুন

${a/foo/bar} অথবা ${a//foo/bar}

প্রথম ফর্মটিতে কেবলমাত্র প্রথম উদাহরণটি প্রতিস্থাপন করা হয়েছে। দ্বিতীয় ফর্মটি বিশ্বব্যাপী অনুসন্ধান এবং প্রতিস্থাপন।

আপনার ক্ষেত্রে, এটি হবে

পরিবর্তে:

if echo $x | grep foo
then
    ...
fi

ব্যবহার বিবেচনা করুন:

if [ $x =~ foo ]
then
    ...
fi

যেখানে fooনিয়মিত প্রকাশ হয়।


কোন শাঁসে এই কাজ করে?
পেলটিয়ার

1
if [ $x =~ foo ]এখানে একটি ত্রুটি বার্তা দেয়। if [[ $x =~ foo ]]তবে, দুর্দান্ত কাজ করে। ধন্যবাদ!
দেবসোলার

1
এগুলি বাশিজম, তাদের বাশ দরকার। =~তদ্ব্যতীত , bash> = 3 iirc প্রয়োজন।
haphink

1
প্রথমত, foo এই উদাহরণগুলিতে একটি নিয়মিত প্রকাশ নয় (পিসিআরই হিসাবে), তবে ওয়াইল্ডকার্ড ব্যবহার করে। ব্যাশ ম্যানপেজে বিভাগের "প্যারামিটার সম্প্রসারণ" বিভাগে এই ব্যাশ সদ্ব্যবহারের আরও রয়েছে। আমি বিশেষত ${a##foo}এবং মত জিনিস প্রশংসা করি ${a%%bar}
haphink

3
ম্যাচ অপারেটর =~নিয়মিত এক্সপ্রেশন ব্যবহার করে। এটি সত্য, উদাহরণস্বরূপ: [[ "abcdddde" =~ ^a.*d+.g* ]](এটি জি-ওয়াইল্ডকার্ডের চেয়ে শূন্য বা আরও বেশি জি এর উদাহরণস্বরূপ)।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2

কোনও ভেরিয়েবলের কোনও প্যাটার্ন থাকে তা পরীক্ষার জন্য একটি ভাল পজিক্স সামঞ্জস্যপূর্ণ উপায়:

test ${var##*foo*} || <do something>;

পরামিতি প্রসারণের বাক্য গঠনটি হ'ল:

 ${parameter##pattern}

যেখানে patternএকটি হল শেল প্যাটার্ন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.