ডান থেকে বাম শেল বন্ধনী সম্প্রসারণ


9

Zsh এ (এবং অন্যান্য শেল), যদি আমি যুক্তি অন্তর্ভুক্ত করি (উদাহরণস্বরূপ):

{a,b,c}{d,e,f}

ব্রেস সম্প্রসারণ এটিকে পরিণত করে:

ad ae af bd be bf cd ce cf

আমার উদ্দেশ্যগুলির জন্য, যুক্তির ক্রমটি গুরুত্বপূর্ণ এবং বাম থেকে ডান পরিবর্তে ডান থেকে বামে প্রসারিত করার জন্য আমার ধনুর্বন্ধনী প্রয়োজন। এটি হ'ল আমি চাই সম্প্রসারণটি হ'ল:

ad bd cd ae be ce af bf cf

ক্রমগুলি একাধিক সেট প্রসারিত করার আদেশকে নিয়ন্ত্রণ করার কোনও উপায় আছে কি? আমি এমন কিছু খুঁজছি যা যে কোনও পরিস্থিতিতে কার্যকর হবে, কেবল এই যুক্তি দিয়ে নয় work


আমি ধরে নিয়েছি আপনি লুপগুলি বা সাজানো আউটপুট জড়িত আরও জটিল সমাধানগুলিতে আগ্রহী নন, তাই না?
টেরডন

@ অ্যারডন যদি মনে না হয় অন্য কোনও উপায় নেই; আমি আশা করছিলাম ব্রেস সম্প্রসারণের মূল্যায়নের ক্রম পরিবর্তন করার কিছু কৌশল ছিল তবে সম্ভবত তা হয়নি। এই যুক্তিগুলি কেবল উদাহরণ ছিল, তাই কেবল যে কাজ করে এমন কিছু {a,b,c}{d,e,f}খুব কার্যকর নয়
মাইকেল মরোজেক

হ্যাঁ, আমি অনেক অনুমান করেছি। সাজানোর ক্রমের ভিত্তিতে উত্তরগুলি এড়াতে আপনি এটি পরিষ্কার করতে চাইতে পারেন।
টেরডন

উত্তর:


8

আপনি ব্রেস প্রসারণের সাথে প্যারামিটার সম্প্রসারণকে একত্রিত করতে পারেন।

% foo=(d e f)
$ echo {a,b,c}${^foo}
ad bd cd ae be ce af bf cf

আপনি যদি fooআলাদাভাবে সংজ্ঞা দিতে না চান (যেমনটি সম্ভবত মনে হয়), আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:

$ echo {a,b,c}${^:-d e f}
ad bd cd ae be ce af bf cf

আপনার যদি rcexpandparamবিকল্প সেট থাকে, তবে ^এই আচরণটি সক্ষম করার জন্য আপনার দুটি উদাহরণের প্রয়োজন নেই ।

(দ্রষ্টব্য: পরীক্ষার সময়, আমার কাছে shwordsplitবিকল্প সেটও ছিল। যদি আপনার এটি সেট না থাকে তবে উদাহরণস্বরূপ চেষ্টা করুন echo {a,b,c}${^=:-d e f}the গল্পটির নৈতিক: প্রায় কোনও কিছুতেই সম্ভব zsh, তবে আপনাকে নিশ্চিত করতে হবে যে আপনি সঠিকটি ব্যবহার করছেন) বিকল্প এবং বাক্য গঠন সমন্বয়।)


1
print -- {a,b,c}${^=:-d e f}আপনার মূল উদাহরণ হিসাবে ব্যবহার করা উচিত , যেহেতু split+globডিফল্টরূপে ইনটি অফ হয়েছিল zsh
cuonglm

4

ইন zshআপনি ব্যবহার করতে পারেন -C কলামের নির্দিষ্ট সংখ্যক আর্গুমেন্ট প্রাপ্ত করতে printমত:

print $(print -C3 {a,b,c}{d,e,f})

... পেতে ...

ad bd cd ae be ce af bf cf

... $IFSনিম্নলিখিত বিভাজন ছাড়া :

print -C3 {a,b,c}{d,e,f}

... কপি করে প্রিন্ট ...

ad bd cd
ae be ce
af bf cf

... তবে আপনি আগে যেমন এটি করতে পারেন ...

print -aC3 {a,b,c}{d,e,f}

ad ae af
bd be bf
cd ce cf

... অথবা ...

print $(print -aC2 {foo,bar}{bad,baz})

foobad foobaz barbad barbaz

এটি একই আউটপুট উত্পাদন করে যা মিচেল এড়াতে চেষ্টা করছে। তিনি 1.1 2.1 3.1 চান এবং আপনি 1.1 1.2 1.3 দিচ্ছেন (যদি তা পরিষ্কার হয়)।
টেরডন

@terdon - ভাল পয়েন্ট।
মাইকজার্ভ

আমি অনুমান করছি (যদিও স্পষ্টভাবে বলা হয়নি) মাইকেল মেশিন জুটির নির্দিষ্ট আদেশের পরে। আপনার পদ্ধতিটি কেবল তখনই কাজ করে যদি উপাদানগুলিকে বর্ণমালা অনুসারে বাছাই করা যায়। foobad foobaz barbad barbaz{Foo, বার {{খারাপ, বাজ} from থেকে প্রাপ্ত সম্পর্কে কী ?
টেরডন

@ ইটারডন - আচ্ছা, যদি সে পরে থাকে তবে কেন এমনটি বলা হচ্ছে না? এবং যাইহোক, আপনি যদি গণিতটি করেন তবে কলামগুলি যে কোনও উপায়ে তৈরি করা যায়।
মাইকজার্ভ

1
@ ইটারডন - আপনার মডারেটররা আপনার অর্থ কি বোঝাতে চাইছে না তা বলার অভ্যাস বলে মনে করছেন।
মাইকজার্ভ

2

আপনি দ্বিতীয় সেটটির প্রতিটি উপাদানটির শেষে নম্বর স্থাপন করতে পারেন এবং তারপরে শেষ অক্ষর অনুসারে বাছাই করতে পারেন:

echo -e "\n"{a,b,c}{d1,e2,f3} | sort -k 1.3 | cut -c 1-2 | tr '\n' ' '

এমনকি আরও কিছু ভাল হবে কিছু বিভাজক (স্পেস) এর পরে সংখ্যা যুক্ত করা, ক্ষেত্রগুলি কাটাতে, অক্ষর নয়:

echo -e "\n"{a,b,c}{"d 1","e 2","f 3"} | sort -k 2n | cut -f 1 -d ' ' -s | tr '\n' ' '

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