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

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

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

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

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

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

Shell

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

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

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

Больше примеров в конспекте

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

Основная документация: 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-арт (аккуратнее с пробелами).

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

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

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

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

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

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

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

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

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

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

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

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

LecturesCMC/LinuxApplicationDevelopment2025/03_Text (последним исправлял пользователь FrBrGeorge 2025-09-30 13:21:59)