LINUX.ORG.RU

Как изящнее в bash написать генерацию последовательности чисел?

 ,


0

1

Есть вот такой скрипт, который ищет первый незанятый логин на GitHub, для настоящих анонимов. Можно адаптировать и к другим сервисам.

#!/bin/bash
SEQ=`seq -w 0 9`
SEQ+=$'\n'
SEQ+=`seq -w 0 99`
SEQ+=$'\n'
SEQ+=`seq -w 0 999`
SEQ+=$'\n'
SEQ+=`seq -w 0 9999`
for i in $SEQ;
do
        wget -q https://github.com/anonymous$i -O  /dev/null
        [[ $? -ne 0 ]] && echo "$i NOT FOUND" && exit
done

Есть идеи, как избавиться от простыни seq?

Вся проблема в том, что при генерации хочу учитывать 0, 00, 000, 0000 и т.д, а так же отдельно одно-, двух-, трех-, четырехзначные числа и т.д.

изящнее в bash

/0

anonymous
()
SEQ=$(echo -e '0\n00\n000\n0000' | sed -n -r ':st; p; s/^9+$/&/; t; ti9; :i9; s/9(x*)$/x\1/; ti9; s/ (x*)$/ 1\1/; tf; s/0(x*)$/1\1/; tf; s/1(x*)$/2\1/; tf; s/2(x*)$/3\1/; tf; s/3(x*)$/4\1/; tf; s/4(x*)$/5\1/; tf; s/5(x*)$/6\1/; tf; s/6(x*)$/7\1/; tf; s/7(x*)$/8\1/; tf; s/8(x*)$/9\1/; tf; :f; s/x/0/; tf; bst')


Первое что на ум пришло.

evilface ★★
()
Последнее исправление: evilface (всего исправлений: 1)
Ответ на: комментарий от Deleted

сорян, но leading — ведущий, а не лидирующий Ж)

UPD: но лидер как бы всех ведет, т.е. он ведущий, т.е. лидирующий? В рот мне зубы!

slon
()
Последнее исправление: slon (всего исправлений: 1)
Ответ на: комментарий от evilface

Новая версия!

SEQ=$(echo iiii | sed ':st; H; x; y/i/0/; x; s/i//; tst; g; s/^.\(.*\)./\1/' | tac | sed -n -r ':st; p; s/^9+$/&/; t; ti9; :i9; s/9(x*)$/x\1/; ti9; s/ (x*)$/ 1\1/; tf; s/0(x*)$/1\1/; tf; s/1(x*)$/2\1/; tf; s/2(x*)$/3\1/; tf; s/3(x*)$/4\1/; tf; s/4(x*)$/5\1/; tf; s/5(x*)$/6\1/; tf; s/6(x*)$/7\1/; tf; s/7(x*)$/8\1/; tf; s/8(x*)$/9\1/; tf; :f; s/x/0/; tf; bst')


(Писать tac на sed'е было лень).

В общем, мануал: подставляешь i в количестве длины самого большого числа (в примере 9999, тут четыре i) и оно работает.

evilface ★★
()
Ответ на: комментарий от d_a

Вся проблема в том, что при генерации хочу учитывать 0, 00, 000, 0000 и т.д, а так же отдельно одно-, двух-, трех-, четырехзначные числа и т.д.

anonymous00 ★★
() автор топика

Есть идеи, как избавиться от простыни seq?

Не благодари. (--version 4.3.11(1), результат точно такой же)

echo {0..9} {00..99} {000..999} ...

znenyegvkby
()
Ответ на: комментарий от znenyegvkby

От лица сообщества анонимов, как один из его членов, благодарю тебе.

anonymous
()

SEQ=`seq -w 0 9`
SEQ+=$'\n'

SEQ=$(
  seq -w 0 9
  seq -w 0 99
  ...
)

уже не так плохо смотрится, а

{ seq -w 0 9
  seq -w 0 99
  ...
} | while read -r line
do
  ...
done

терпимо

anonymous
()
Ответ на: комментарий от anonymous

Благодарю! Лучшее решение, IMO. Хотя решение znenyegvkby намного проще, но оно требует внимательно указать все диапазоны, и не упустить пробелы. Тут же расширять диапазон можно просто меняя первый аргумент seq.

anonymous00 ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.