ब्रेस विस्तार का उपयोग करके अग्रणी शून्य के साथ एक अनुक्रम कैसे बनाया जाए


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. यदि आपको 3 अंकों की आवश्यकता है तो आप "3 .3d" में बदल सकते हैं।


आपके उत्तर के लिए धन्यवाद। मुझे 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

हालांकि इस मामले के लिए कुछ समय बाद लूप साफ हो जाएगा और किसी भी POSIX शेल में काम करेगा:

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

शून्य, ini और फिन var हैं, इसलिए इसका आसान, यो केवल शून्य लिखते हैं जो यू को समस्या के बिना ini के लिए 'शून्य' में कहते हैं;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.