ব্রেস প্রসারণ ব্যবহার করে শীর্ষস্থানীয় শূন্যগুলির সাথে কীভাবে একটি সিকোয়েন্স তৈরি করবেন


45

আমি যখন নিম্নলিখিতগুলি ব্যবহার করি, তখন প্রত্যাশার মতো ফলাফল পাই:

$ echo {8..10}
8 9 10

নীচের আউটপুটটি পেতে, আমি কীভাবে এই ব্রেস সম্প্রসারণকে সহজ উপায়ে ব্যবহার করতে পারি?

$ echo {8..10}
08 09 10

আমি এখন এটি ব্যবহার করে প্রাপ্ত হতে পারি seq(চেষ্টা করিনি), তবে এটি আমি খুঁজছি না।

দরকারী তথ্য হতে পারে যে আমি এই ব্যাশ সংস্করণে সীমাবদ্ধ। (আপনার যদি zshসমাধান হয় তবে bashসমাধান না হলে দয়া করেও শেয়ার করুন)

$ bash -version
GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)

কিছু বাশ 3 এ করার ইঙ্গিতটি আমি এখানে পেয়েছি: mywiki.wooledge.org/BashFAQ/018 তবে, সেখানে বর্ণিত পদ্ধতিটি সুবিধাজনক নয়।
বার্নহার্ড

উত্তর:


70

0প্রতিটি পদকে একই প্রস্থে বাধ্য করতে বাধ্য করে প্রথম সংখ্যাটির উপসর্গ করুন ।

$ echo {08..10}
08 09 10

ব্রেস এক্সপেনশনে ব্যাশ ম্যান পৃষ্ঠা বিভাগ থেকে:

সরবরাহকৃত পূর্ণসংখ্যাগুলি প্রতিটি পদকে একই প্রস্থে বাধ্য করার জন্য 0 দিয়ে উপসর্গ করা যেতে পারে। যখন x বা y হয় শূন্য দিয়ে শুরু হয়, শেল সমস্ত উত্পন্ন পদকে একই সংখ্যার সংখ্যার, যেখানে শূন্য-প্যাডিং প্রয়োজন সেখানে জোর করার চেষ্টা করে।

এছাড়াও নোট করুন যে আপনি নেতৃস্থানীয় জিরোগুলির সাথে প্যাডিং করে প্রস্থকে সমান seqকরার -wবিকল্পটি ব্যবহার করতে পারেন :

$ seq -w 8 10
08
09
10

$ seq -s " " -w 8 10
08 09 10

আপনি যদি আরও নিয়ন্ত্রণ চান, আপনি এমনকি একটি মুদ্রণ শৈলী বিন্যাস নির্দিষ্ট করতে পারেন:

$ seq -s " " -f %02g 8 10
08 09 10

8
echo {08..10}সমাধানটি সন্ধান করার পরে , তবে এটি কেবল ব্যাশ সংস্করণ 4 এবং তার বেশি জন্য প্রবর্তিত হয়েছে।
বার্নহার্ড

এটি আমাকে একটু অস্বস্তি করে তোলে যে বাশ তা করে। গুচ্ছ ইউটিলিটিগুলির জন্য (উদাহরণস্বরূপ perl) একটি শীর্ষস্থানীয় শূন্য একটি অষ্টাল সংখ্যা নির্দেশ করে। আমি মনে করি এটি প্রায়শই আপনি
অষ্টাল

5
এটা লক্ষনীয় যে আপনার কাছে সংখ্যার যখন তখন দান পূর্বে ভী করতে seqসঙ্গে -wতাই মত সুইচ: seq -w 003সংখ্যার 001, 002, এবং 003. উত্পাদন করে
SLM

@ কুর্টম নেতৃস্থানীয় জিরো সম্পর্কে চিন্তা করবেন না। কিছু যখন কোনও সংখ্যাকে বিশ্লেষণ করার চেষ্টা করে তখন তা আঘাত করতে পারে। এটিতে যা দরকারী তা হ'ল একটি ফাইল নাম ক্রম তৈরি করা foo_00001.someextensionযেখানে প্রায় সমস্ত বাছাই করা প্রসঙ্গ একটি বুদ্ধিমান ক্রম সরবরাহ করে।
স্টাফেন গৌরিচন

9

আপনি যদি প্রিন্টফ ব্যবহার করেন

printf "%.2d " {8..10} 

এটি 2 টি চর হতে বাধ্য করবে এবং শীর্ষস্থানীয় 0 যুক্ত করবে add আপনার যদি 3 ডিজিটের প্রয়োজন হয় তবে আপনি "% .3 ডি" তে পরিবর্তন করতে পারবেন।


আপনার উত্তরের জন্য ধন্যবাদ. আমি printfসমাধান সম্পর্কে সচেতন , কিন্তু এটি সত্যিই এটিকে সহজ করে তুলছে না। আমি আশা করছি যে কিছু গোপন কৌশল আছে যা কাজটি করে :)
বার্নহার্ড

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

7

একটি ধ্রুবক ব্যবহার করুন যা ধ্রুবক অঙ্ক দিয়ে শুরু হয় এবং সেই অঙ্কটি বন্ধ করে দেয়:

echo \ {108..110} | sed 's/ 1//g'

বা বাহ্যিক আদেশ ব্যবহার না করে:

a=({108..110}); echo "${a[@]#1}"

লুপের জন্য একটিতে ব্যবহারের জন্য:

for x in {108..110}; do
  x=${x#1}
  
done

যদিও এই ক্ষেত্রে কিছুক্ষণের জন্য লুপটি আরও পরিষ্কার হবে এবং কোনও পসিক্স শেলটিতে কাজ করবে:

x=8
while [ $x -le 10 ]; do
  n=$((100+x)); n=${n#1}
  
  x=$((x+1))
done

আমি অন্যান্য উত্তরগুলির উপরে এই উত্তরটি গ্রহণ করেছি, কারণ এটি বাশ 3.x এর অনুরোধটি সন্তুষ্ট করে। বিশেষত আমার যেভাবে forলুপের প্রয়োজন ছিল ।
বার্নহার্ড

6

আমার কাছে মূল পোস্টার ( GNU bash, version 3.2.51(1)-release) এর একই বাশ সংস্করণ রয়েছে এবং {08..12}এটি আমার জন্য কাজ করে না, তবে নিম্নলিখিতগুলি নিম্নলিখিতটি করে:

for i in 0{8..9} {10..12}; do echo $i; done
08
09
10
11
12

এটি কিছুটা ক্লান্তিকর, তবে এটি ব্যাশের ওপি সংস্করণে (এবং পরবর্তী সংস্করণগুলি, আমি ধরে নেব) কাজ করে।


আমি এই সমাধান সম্পর্কে চিন্তা না (যদিও আমার ক্ষেত্রে আমি আসলে এছাড়াও সংখ্যা 0001 1000, কিন্তু অবশ্যই আপনার নীতি কাজ করতে চাই।
বের্নহার্ট

1

রেফারেন্সের জন্য, আমি মনে করি স্বয়ংক্রিয় স্থির-প্রস্থ কেবল বাশের সর্বশেষতম সংস্করণ সহ ঘটে:

$ bash -version
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

$ echo test{00..05}
test0 test1 test2 test3 test4 test5

-3
for i in $(seq -s " " -f %0${zeros}g $ini $fin); do ....;done

জিরোস, আইএনআই এবং ফিন ভার্স, সুতরাং এটি সহজ, আপনি কেবল জিরো লিখুন যা আপনি 'জিরো'-তে বলেছিলেন যে সমস্যা ছাড়াই ফিন করার জন্য;)

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