সংক্ষিপ্ত উত্তর এখানে। প্রথম অভিব্যক্তিতে কমাটি বিভাজক হিসাবে ব্যবহৃত হয়, তাই বন্ধনী সম্প্রসারণটি দুটি নেস্টেড সুব এক্সপ্রেশনগুলির সংক্ষেপণ। দ্বিতীয় এক্সপ্রেশনে কমা নিজেই, একটি একক-অক্ষর subexpression হিসাবে গণ্য তাই পণ্যের এক্সপ্রেশন হয় গঠন করে।
আপনি যা হারিয়েছিলেন তা হ'ল বন্ধনী-বিস্তৃতি কীভাবে সম্পাদিত হয় তার সংজ্ঞা। এখানে তিনটি উল্লেখ রয়েছে:
আরও একটি বিশদ বিবরণ নিম্নলিখিত।
আপনি এই অভিব্যক্তির ফলাফলের সাথে তুলনা করেছেন:
$ echo {{a..c},{1..3}}
a b c 1 2 3
এই মত প্রকাশের ফলাফল:
$ echo {a..c},{1..3}
a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,3
আপনি বলেছেন যে এটি ব্যাখ্যা করা শক্ত, অর্থাত্ এটি পাল্টা স্বজ্ঞাত। কী অনুপস্থিত তা হ'ল বন্ধনী-বিস্তৃতি কীভাবে প্রক্রিয়া করা হয় তার একটি আনুষ্ঠানিক সংজ্ঞা। আপনি নোট করেছেন যে বাশ ম্যানুয়াল পুরো সংজ্ঞা দেয় না।
আমি কিছুটা অনুসন্ধান করেছি কিন্তু আমি অনুপস্থিত (সম্পূর্ণ, আনুষ্ঠানিক) সংজ্ঞাটিও পাই না। সুতরাং আমি উত্স কোড গিয়েছিলাম:
উত্সটিতে বেশ কয়েকটি দরকারী মন্তব্য রয়েছে। প্রথমটি হ'ল বন্ধনী সম্প্রসারণ অ্যালগরিদমের একটি উচ্চ-স্তরের ওভারভিউ:
Basic idea:
Segregate the text into 3 sections: preamble (stuff before an open brace),
postamble (stuff after the matching close brace) and amble (stuff after
preamble, and before postamble). Expand amble, and then tack on the
expansions to preamble. Expand postamble, and tack on the expansions to
the result so far.
সুতরাং একটি ধনুর্বন্ধনী-প্রসারণ টোকেনের বিন্যাসটি নিম্নলিখিত:
<PREAMBLE><AMBLE><POSTAMBLE>
মূল প্রসারণের মূল প্রবেশ-পয়েন্টটি একটি ফাংশন বলা হয় brace_expand
যা নীচে বর্ণিত:
Return an array of strings; the brace expansion of TEXT.
সুতরাং brace_expand
ফাংশনটি একটি ব্রেস প্রসারিত এক্সপ্রেশনকে উপস্থাপন করে একটি স্ট্রিং নেয় এবং প্রসারিত স্ট্রিংগুলির অ্যারে প্রদান করে।
এই দুটি পর্যবেক্ষণের সংমিশ্রণে আমরা দেখতে পাচ্ছি am পোস্টমাম্বলটিকে তারপরে স্ট্রিংয়ের তালিকায় প্রসারিত করা হয় এবং পোস্টাম্বল তালিকার প্রতিটি স্ট্রিং উপস্থাপনযোগ্য / এম্বেল তালিকার প্রতিটি স্ট্রিংয়ের সাথে সংযুক্ত করা হয় (অর্থাত্ দুটি তালিকার পণ্য গঠিত হয়)। তবে এটি কীভাবে সামঞ্জস্যপূর্ণ এবং পোস্টাম্বল প্রক্রিয়াজাত করা হয় তা বর্ণনা করে না। ভাগ্যক্রমে সেই সাথে বর্ণনা করার জন্য একটি মন্তব্য রয়েছে। এম্বেলটি এমন একটি ফাংশন দ্বারা প্রক্রিয়াজাত হয় expand_amble
যার নাম সংজ্ঞায়িত করা হয় নিম্নলিখিত মন্তব্যের আগে:
Expand the text found inside of braces. We simply try to split the
text at BRACE_ARG_SEPARATORs into separate strings. We then brace
expand each slot which needs it, until there are no more slots which
need it.
কোডের অন্য কোথাও আমরা দেখতে পাচ্ছি যে BRACE_ARG_SEPARATOR কমা হিসাবে সংজ্ঞায়িত হয়েছে। এটি স্পষ্ট করে দেয় যে অ্যাম্বলটি একটি কমা-বিচ্ছিন্ন স্ট্রিংয়ের তালিকা, যার মধ্যে কয়েকটি ব্রেস-এক্সপেনশন এক্সপ্রেশনও হতে পারে। এই স্ট্রিংগুলি পরে একটি একক অ্যারে গঠন করে। পরিশেষে, আমরা তাও দেখতে পারেন যে পরে expand_amble
বলা হয় brace_expand
ফাংশন তারপর postamble উপর যাও recursively বলা হয়। এটি আমাদেরকে অ্যালগরিদমের সম্পূর্ণ বিবরণ দেয়।
কিছু অন্যান্য (বেসরকারী) রেফারেন্স রয়েছে যা এই অনুসন্ধানকে সমর্থন করে।
একটি রেফারেন্সের জন্য, ব্যাশ হ্যাকারস উইকি পরীক্ষা করে দেখুন । সংমিশ্রণ এবং নেস্টিংয়ের বিভাগটি আপনার সমস্যাটিকে পুরোপুরি সমাধান করে না, তবে পৃষ্ঠাটি ব্রেস প্রসারণের বাক্য গঠন / ব্যাকরণ দেয়, যা আমি মনে করি আপনার প্রশ্নের উত্তর দেয়। বাক্য গঠনটি নিম্নলিখিত নিদর্শনগুলি দ্বারা দেওয়া হয়:
{string1,string2,...,stringN}
{<START>..<END>}
<PREAMBLE>{........}
{........}<POSTSCRIPT>
<PREAMBLE>{........}<POSTSCRIPT>
এবং পার্সিংটি নিম্নরূপ বর্ণিত হয়েছে:
ব্রেস এক্সপেনশন স্বেচ্ছাসেবী স্ট্রিং উত্পন্ন করতে ব্যবহৃত হয়। নির্দিষ্ট স্ট্রিংগুলি surroundingচ্ছিক পার্শ্ববর্তী উপস্থাপত্র এবং পোস্ট স্ক্রিপ্টগুলির সাথে সমস্ত সম্ভাব্য সংমিশ্রণ তৈরি করতে ব্যবহৃত হয় ।
অন্য একটি রেফারেন্সের জন্য, ব্যাশ বিগিনিয়ার গাইডটি দেখুন , যা এখানে নীচে বলে:
Brace expansion is a mechanism by which arbitrary strings may be generated. Patterns to be brace-expanded take the form of an optional PREAMBLE, followed by a series of comma-separated strings between a pair of braces, followed by an optional POSTSCRIPT. The preamble is prefixed to each string contained within the braces, and the postscript is then appended to each resulting string, expanding left to right.
সুতরাং ব্রেস-এক্সপেনশন এক্সপ্রেশনগুলি বিশ্লেষণ করতে আমরা বাম থেকে ডানে চলে যাই, প্রতিটি অভিব্যক্তি প্রসারিত করে এবং ধারাবাহিক পণ্যগুলি তৈরি করি (স্ট্রিং-কনটেনটেশনের ক্রিয়াকলাপের ক্ষেত্রে)।
এখন আসুন আপনার প্রথম অভিব্যক্তি বিবেচনা করুন:
{{a..c},{1..3}}
বাশ হ্যাকারের উইকের ভাষায়, এটি প্রথম ফর্মটির সাথে মেলে:
{string1,string2,...,stringN}
কোথায় N=2
, string1={a..c}
এবং string2={1..3}
- ভিতরে বক্রবন্ধনী প্রসারণও প্রথম সম্পাদনা করা হচ্ছে এবং তাদের প্রতিটি ফর্মের হচ্ছে {<START>..<END>}
। বিকল্পভাবে, আমরা বলতে পারি যে এটি একটি ধনুর্বন্ধনী-সম্প্রসারণ অভিব্যক্তি যা কেবলমাত্র একটি ছাঁটাই (কোনও উপস্থাপনা বা পোস্টমামেবল) নিয়ে গঠিত। এম্বেলটি কমা দ্বারা বিযুক্ত তালিকা, সুতরাং আমরা তালিকাটিতে একবারে একটি স্লট দিয়ে যাই, এবং যেখানে প্রয়োজন সেখানে অতিরিক্ত বিস্তৃতিও সম্পাদন করি। কোনও পণ্য তৈরি হয় না কারণ এখানে কোনও সংলগ্ন অভিব্যক্তি নেই (কমাটি বিভাজক হিসাবে ব্যবহৃত হয়)।
পরবর্তী আপনার দ্বিতীয় অভিব্যক্তি তাকান:
{a..c},{1..3}
বাশ হ্যাকারের উইকের ভাষায়, এই অভিব্যক্তিটি ফর্মটির সাথে মেলে:
{........}<POSTSCRIPT>
যেখানে পোস্টস্ক্রিপ্ট হল সাব-এক্সপ্রেশন ,{1..3}
। বিকল্পভাবে, আমরা বলতে পারি যে এই অভিব্যক্তিটির একটি সামঞ্জস্যপূর্ণ ( {a..c}
) এবং একটি পোস্টাম্বল ( ,{1..3}
) রয়েছে। কাঠামোটি তালিকায় প্রসারিত হয় a b c
এবং তারপরে পোস্টমামিলের প্রসারণের প্রতিটি স্ট্রিংয়ের সাথে এগুলির প্রতিটি সংযুক্ত করা হয়। পোস্টমামলটি পুনরাবৃত্তিমূলকভাবে প্রক্রিয়াজাত করা হয়: এটির একটি উপস্থাপনা ,
এবং এর একটি প্রতীক রয়েছে {1..3}
। এটি তালিকায় প্রসারিত ,1 ,2 ,3
। দুটি তালিকা a b c
এবং ,1 ,2 ,3
তারপরে একত্রিত হয়ে পণ্য তালিকা তৈরি করা হয় a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,3
।
এই এক্সপ্রেশনগুলি কীভাবে পার্স করা হয়েছে তার একটি চিত্রযুক্ত-বীজগণিত বিবরণ দিতে সাহায্য করতে পারে, যেখানে বন্ধনী "[]" অ্যারেগুলি বোঝায়, "+" অ্যারে কনটেনটেশনকে বোঝায়, এবং "*" কার্টেসিয়ান পণ্যটিকে বোঝায় (সংক্ষেপে শ্রদ্ধার সাথে)।
এখানে প্রথম প্রকাশটি কীভাবে প্রসারিত হবে (প্রতি লাইনে এক ধাপ):
{{a..c},{1..3}}
{a..c} + {1..3}
[a b c] + [1 2 3]
a b c 1 2 3
এবং এখানে দ্বিতীয় প্রকাশটি কীভাবে প্রসারিত হবে:
{a..c},{1..3}
{a..c} * ,{1..3}
[a b c] * [,1 ,2 ,3]
a,1 a,2 a,3 b,1 b,2 b,3 c,1 c,2 c,3