Обработка текстов и сценарии

Более плотная лекция 2020 года на похожую тему

Задача склейки

Командная строка как основной интерфейс управления

⇒ Понятие сценария:

Почему это часто встречается при сборке? Рецепты в make — это именно сценарии shell!

Shell

Глава из учебника про shell

(Интерпретатор: редактор командной строки, история, достраивание, alias-ы, …, управление заданиями)

ЯП с упором на склейку

TODO примеры {i}

Утилиты для работы с файловой системой и процессами

Основная документация: GNU coreutils

Утилиты работы с текстом

Проблема локали:

   1 $ ls /etc/ | sort | tail -20 | tee text1
   2 $ ls /etc/ | LC_ALL=C sort | tail -20 | tee text2
   3 $ diff -u text1 text2

Основная документация: GNU coreutils

Комбайны

Д/З

  1. Прочитать и попробовать всё, что вам покажется релевантным задаче из GNU coreutils, возможно, больше

  2. В репозитории с Д/З сделать (вложенный) подкаталог 03_Text, а в нём — сценарий на shell randomize.sh, который принимает один необязательный параметр — время задержки в секундах (вещественное) перед выводом очередного символа, затем читает со стандартного ввода небольшой файл с ASCII-артом в кодировке ASCII и без символов табуляции, после чего выводит его посимвольно в случайном порядке в левый верхний угол экрана. Должен получиться с виду тот же ASCII-арт (аккуратнее с пробелами).

    • Что может понадобиться:

      • Перенаправление ввода-вывода
      • tput (cup и clear, было на лекции) из пакета termutils

      • Арифметика в shell (конструкция вида $((…)))

      • Параметры командной строки shell-сценария (конструкция вида $1, $2 и т. п.)

      • Цикл while в shell

      • od или hexdump (приключение с od — не забыть ключ -v!)

      • tr или sed

      • shuf

      • sleep

    • Условие: нельзя пользоваться другими языками программирования, кроме shell (sed-ом можно, но можно обойтись и без него).

    • <!> Необязательное дополнение: скрипт должен выполняться стандартным shell-ом (не bash, а dash, он же ash, например). Я пока нашёл одну неприятность; встроенное echo в ash не умеет -e — пользуйтесь /bin/echo, оно умеет

    • <!> Необязательное дополнение: научиться работать с псевдографикой и русскими буквами.

      • Проблема: русские буквы в UTF8 занимают два байта, а псевдографика — вообще три
      • Решение: сначала перекодировать поток (iconv) в UCS2, например, там всё будет одинаковое

    • <!> Необязательное дополнение: выводить ASCII-арт посередине экрана

      • Проблема (неожиданная): посчитать во входном потоке количество строк и максимальную ширину строки легко, а вот передать эти данные перед тем, как передать остальные, данные просто так не получится

      • Размер экрана — stty (причём поскольку стандартный ввод — это не терминал, то конкретно stty size < /dev/tty)

      • Решение: использовать временный файл (mktemp) — только обязательно удалять его

Я решал сложный вариант задачи так (нажмите «Комментарии» в шапке страницы, чтобы прочитать спойлер на русском, осталось только перевести на shell ☺):

Базовое решение короче и проще:

Вариант 2021 года:

Вариант прошлого года (рамочка и фон рисуются с помощью dialog; да, она должна быть на 1 больше, но мне понравилось, что месяц отображается в виде заголовка ☺); всего менее 40 строк кода

LecturesCMC/LinuxApplicationDevelopment2024/03_Text (последним исправлял пользователь FrBrGeorge 2024-10-05 18:23:49)