генератор символов

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

генератор символов

Сообщение olecya »

Наткнулась на статью в ней говорилось об эксперименте как на джаваскрипт
можно выяснить является ли число простым. Суть этого метода заключалась в следующем.
Преобразуем число в унарную форму, ее можно представить как счет на палочках
3 записывается как 111
7 как 1111111
и все это дело, как я по быстрому накидала для шел, перенаправляется сюда

Код: Выделить всё

egrep -x '1?|(1{2,})\1+'
Но! Я принадлежу к новому поколению и считать на палочках как оказалось меня не научили :mellow:
По быстрому проверяю строчку

Shell

shuf -e 1 -zrn 10 | egrep -x '1?|(1{2,})\1+'
Двоичный файл (стандартный ввод) совпадает
Забываю что разделителем выступает машинный ноль.

Shell

shuf -e 1 -zrn 10 | cat -vet
1^@1^@1^@1^@1^@
Чтобы не менять стойку просто добавляю

Shell

echo $(shuf -e 1 -zrn 10) | egrep -x '1?|(1{2,})\1+'
bash: предупреждение: подстановка команды: во входных данных проигнорирован нулевой байт
Думаю если откатиться на такую конструкцию получу 2 пайпа

Код: Выделить всё

yes 1 | head -10 | tr -d '\n'
если вместо echo использовать тот же tr

Код: Выделить всё

shuf -e 1 -zrn 10 | tr -d '\0' | egrep -x '1?|(1{2,})\1+'
Работает. Возвращаюсь к регулярке и понимаю что палочки вполне можно заменить на камушки :)
и нет выгоды в использовании shuf

Код: Выделить всё

seq -s* 10 | tr -d '[0-9]\n' | egrep -x '.?|(.{2,})\1+'
Вспоминаю еще об одной конструкции, но там тоже используются управляющие последовательности
и передавать такую строчку в пайп придется опять же через команду tr. На всякий случай смотрю на результат

Shell

echo $_{1..10}$'\b'* | cat -vet
^H* ^H* ^H* ^H* ^H* ^H* ^H* ^H* ^H* ^H*$
Ну вот, нет быстрого способа repeat или replicate. Я сплюнула капу или
может подправить регулярку чтобы она учитывала разделитель, наверное опция -z в grep здесь не поможет? :)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: генератор символов

Сообщение Bizdelnick »

perl -e "print '1'x10"
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: генератор символов

Сообщение olecya »

На гитхабе можно найти все, В моем дропбоксе, как в моей сумочке, можно найти тоже наверное все но придется потратить на это часть своей жизни. Тем не менее найденная недавно заметка просится в этот пост.
Возьмем команду printf со строкой форматирования %s (подойдет и %b и даже и еще есть претенденты). Если перед спецификатором указать модификатор точку с числом то это будет ширина поля для вывода в данном случае строки и лишнее будет безжалостно обрезано. Если же указать ноль то это будет хорошим способом спрятать выводимый аргумент. Если же опустить и ноль то это будет называться не документированным эквивалентом с нулем. И так запускаем генератор символов, думаю он должен заслужить первое место в этом топике

Shell

printf %.s* {1..10}
**********
Если я где то перепутала определения спецификатор с модификатором и строкой форматирования - каюсь в своем невежестве и всегда открыта к познанию нового...
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: генератор символов

Сообщение olecya »

В процессе работы над этим скриптом Используем символы псевдографики(который я подвергла основательной ревизии) нашла еще такую бяку, основанную на управляющей последовательности:

Shell

echo -e '+\e[10b'
+++++++++++
Этому варианту доступны даже многобайтовые символы и как видно даже двойной ширины:

Shell

wc -c <<<死
4
wc -L <<<死
2
echo -e '死\e[10b'
死死死死死死死死死死死
printf '%b\e[%db\n' 打 10
打打打打打打打打打打打
Добавлено (13:53):
olecya писала:
26.08.2020 19:51
printf %.s* {1..10}
**********
А в этом варианте не плохо бы добавить перенос строки:

Shell

printf %.1s +{1..10} $'\n'
++++++++++
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: генератор символов

Сообщение Bizdelnick »

olecya писала:
26.12.2020 13:49
нашла еще такую бяку
Это и правда бяка с неочевидным поведением. Терминал-то нарисует то, что Вы хотите (если поддерживает соответствующую escape-последовательность, что надо, по-хорошему, предварительно проверить), но если записать в файл или, скажем, на принтер отправить, получится совсем не то. Точнее, ровно то, что было передано echo.

Shell

% echo -e '死\e[10b' | hd
00000000 e6 ad bb 1b 5b 31 30 62 0a |....[10b.|
00000009
%
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: генератор символов

Сообщение olecya »

Bizdelnick писал:
26.12.2020 15:57
hd
Это псевдоним hexdump -C?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20794
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: генератор символов

Сообщение Bizdelnick »

olecya писала:
26.12.2020 18:10
Bizdelnick писал:
26.12.2020 15:57
hd
Это псевдоним hexdump -C?
Да, но не в смысле alias.

Shell

% type hd
hd is /usr/bin/hd
% ls -l /usr/bin/hd
lrwxrwxrwx 1 root root 7 мая 4 2018 /usr/bin/hd -> hexdump
%
man hexdump писал(а):

Код: Выделить всё

     -C      Canonical hex+ASCII display.  Display the input offset in hexa‐
             decimal, followed by sixteen space-separated, two column, hexa‐
             decimal bytes, followed by the same sixteen bytes in %_p format
             enclosed in ``|'' characters.

             Calling the command hd implies this option.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить