ব্যাশ ব্রেস প্রসারণ ব্যবহার করে কমা-বিভাজিত স্ট্রিংগুলি কীভাবে আউটপুট করা যায়


17

আমি পছন্দ করব

$ echo a{b,c,d}

কমা-বিচ্ছিন্ন তালিকা আউটপুট করতে

ab,ac,ad

পরিবর্তে স্বাভাবিক আউটপুট

ab ac ad

কমান্ড লাইনে এটি করার সহজতম উপায় কী?

উত্তর:


9

ধরে নিই যে উপাদানগুলির মধ্যে স্পেস নেই you আপনি স্পেসটি কমাতে অনুবাদ করতে পারেন:

echo a{b,c,d} | tr ' ' ,

যা উত্পাদন করে:

ab,ac,ad

আপনি অক্ষরগুলির সাথে রেঞ্জগুলিও ব্যবহার করতে পারেন:

echo a{b..d} | tr ' ' ,

আপনি যদি আরও বৃহত্তর পরিসর চান তবে এটি বিশেষভাবে কার্যকর।


13

দেখে মনে হচ্ছে ব্যাশ উত্পন্ন শব্দগুলিতে যোগ দিতে $ আইএফএস ব্যবহার করে না। আরেকটি কৌশল একটি অ্যারের মধ্যে উত্পন্ন শব্দ এবং তারপর $ IFS সঞ্চয় করতে হবে হবে খেলা হতে:

আমি একটি সাব-শেল ব্যবহার করতে যাচ্ছি যাতে আমি এই শেলের আইএফএসে পরিবর্তন না করি: এর মধ্যে একটি বেছে নিন

( words=( a{b,c,d} ); IFS=,; echo "${words[*]}" )
( set -- a{b,c,d}; IFS=,; echo "$*" )

এটি স্টাডাউটে কমা-বিভাজনিত স্ট্রিং নির্গত করে। যদি আপনি এটি ক্যাপচার করতে চান:

joined=$( set -- a{b,c,d}; IFS=,; echo "$*" )

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

5

আমি নিশ্চিত যে এটি সম্পাদন করার অনেকগুলি উপায় রয়েছে। এখানে একটি পদ্ধতি:

echo a{b,c,d} | sed 's/ /,/g'

2

আপনি যে উপাদান দেখিয়েছেন সেগুলি প্রসারিত করুন এবং তারপরে লুপ করুন, প্রথমটি পুনরাবৃত্তি বাদে সকলের মধ্যে কমা যুক্ত করুন:

for i in a{b,c,d}; do
  u="${u:+$u, }$i"
done
echo "$u"

ফলাফল:

ab, ac, ad

দেখুন ব্যাশ প্যারামিটার প্রতিকল্পন


1

এখানে একটি বাশ-কেবল সমাধান।

(IN=$(echo a{b,c,d}); echo ${IN// /,})
# ab,ac,ad

সেমিকোলনের আগের অংশটি ab ac adভেরিয়েবলকে নির্ধারিত করে INএবং দ্বিতীয় অংশটি সমস্ত স্থানকে কমাতে পরিবর্তন করতে অনুসন্ধান এবং প্রতিস্থাপন ব্যবহার করে। //সব ম্যাচ মানে শুধুমাত্র প্রথম নয়।

আপনার নাম স্থান দূষিত না করার জন্য এটি একটি সাব-শেল (সংযুক্তকারী বন্ধনী) এ সব করুন।


1

এটি লক্ষণীয় যে অনেক প্রসঙ্গে, একটি পূর্ববর্তী কমা এই জাতীয় তালিকায় গ্রহণযোগ্য। যদি একটি পেছনের কমা গ্রহণযোগ্য হয় তবে প্রতিস্থাপন পরিচালনা করার সবচেয়ে সহজ উপায় হ'ল printf:

some-command "$(printf %s, a{b,c,d} )"

(কোথায় some-command কমান্ডটি যা কমা দ্বারা পৃথক তালিকায় চলে এবং এটি কোনও পূর্ববর্তী কমা সম্পর্কে চিন্তা করে না))

প্রকৃতপক্ষে, আপনার অবশ্যই ব্যবহার করতে পারেন এমন একটি পেছনের কমা না থাকলেও printf; আপনার কেবলমাত্র প্রত্যাশা করা আর্গুমেন্টের সংখ্যা নির্দিষ্ট করতে হবে যা এটি দীর্ঘ দীর্ঘ তালিকার জন্য ক্ল্যামিয়ার করে তোলে:

some-command "$(printf %s,%s,%s a{b,c,d} )"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.