Як створити послідовність із провідними нулями за допомогою розширення дужок


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

З розділу сторінки bash man про розширення Brace:

Поставлені цілі числа можуть бути префіксом 0, щоб змусити кожен додаток мати однакову ширину. Коли або x, або y починається з нуля, оболонка намагається змусити всі згенеровані терміни містити однакову кількість цифр, за необхідності додавання нуля.

Також зверніть увагу , що ви можете використовувати seqз -wпараметром для вирівнювання ширини плюсування з провідними нулями:

$ seq -w 8 10
08
09
10

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

Якщо ви хочете більше контролю, ви навіть можете вказати формат стилю printf:

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

8
echo {08..10}Однак щойно дізнавшись про рішення, він введений лише для bash версії 4 і вище.
Бернхард

Це робить мене трохи незручно, що Баш це робить. Для групи утиліт (наприклад perl) провідний нуль вказує восьмеричне число. Я думаю, не часто ви хочете послідовність восьмеричних чисел ...
kurtm

5
Слід зазначити , що ви можете також префікс номера, даючи потім seqз -wвимикачем , як так: seq -w 003виробляє номера 001, 002 і 003.
ОДС

@kurtm не переживайте за нулі. Це може зашкодити, коли щось намагається розібрати число. Для чого це дійсно корисно - це генерувати послідовність імен файлів, foo_00001.someextensionде майже всі сортування контекстів забезпечують здорове впорядкування.
Стефан Гурішон

9

якщо ви використовуєте printf

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

це призведе до 2 знаків і додасть провідної 0. Якщо вам потрібні 3 цифри, ви можете змінити на "% .3d".


Дякую за вашу відповідь. Я знаю про printfрішення, але це не дуже полегшує це. Я сподіваюся, що є якийсь прихований трюк, який виконує роботу :)
Бернхард

Це єдина відповідь, яка видається достатньо універсальною, щоб вирішити будь-яку обставину для походження номера до прокладки. Я використовую лічильник під час перегляду файлів. Це рішення printf з нульовими колодками бездоганно, тоді як всі інші, здається, зосереджуються на генеруванні нульових цифр, а не на нульовому застосуванні існуючих чисел.
могучий

7

Використовуйте діапазон, який починається з постійної цифри, і викресліть цю цифру:

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

або без використання зовнішньої команди:

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

Для використання у циклі for:

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

Я прийняв цю відповідь вище інших відповідей, оскільки вона задовольняє запит на Bash 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

Це трохи більш виснажливо, але він працює на версії OP-версії bash (і я би припустив, що це стосується і пізніших версій).


Я не замислювався над цим рішенням (хоча в моєму випадку я теж хочу набрати 0001 1000, але ваш принцип, звичайно, працює.
Бернхард

1

Для довідки, я думаю, що автоматична фіксована ширина відбувається лише з останньою версією bash:

$ 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

нулі, іні та плавники - це вари, тому його легко, ви пишете лише нулі, які ви говорите в «нулі» для іні, щоб без проблем закінчити;)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.