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

Лекция позапрошлого года на похожую тему

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

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

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

Почему это часто встречается при сборке? Рецепты в 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. В репозитории с Д/З сделать (вложенный) подкаталог 04_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

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

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

      • Проблема: русские буквы в UTF8 занимают два байта, а псевдографика — вообще три
      • Решение: сначала перекодировать поток в UCS2, например, там всё будет одинаковое
    • <!> Необязательное дополнение: выводить ASCII-арт посередине экрана

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

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

Я решал базовую задачу так (спойлер):

Получилось пока вот что:

Извините, не удержался:

LecturesCMC/LinuxApplicationDevelopment2022/04_Text (последним исправлял пользователь FrBrGeorge 2022-10-11 20:51:04)