Обработка текстов и сценарии
Лекция прошлого года на похожую тему
Задача склейки
Командная строка как основной интерфейс управления
⇒ Сценарий:
- Алгоритмическая полнота
- Поддержка часто используемых команд
- Удобная суперпозиция команд
Почему это часто встречается при сборке?
Shell
- Интерпретатор командной строки
- ЯП ВУ
Ориентация на работу с текстом / фалйами / процессами — склейку
Глава из учебника про shell
(Интерпретатор: редактор командной строки, история, достраивание, alias-ы, …, управление заданиями)
ЯП с упором на склейку
- Переменные и их подстановка с простейшей пост-обработкой
Встроенные команды и программы-команды
- ⇒ «Сколько команд в командной строке»?
⇒ управление процессами (& и wait)
- Перенаправление ввода-вывода
Вывод в строковое выражение «команда»
>, < и 2>
>> и <<
|, великий и могучий!
- Условный оператор и циклы
- Exit status как условие
Утилита test (она же — утилита [)
case и шаблоны
- Генерация имён файлов
Утилиты для работы с файловой системой и процессами
Основная документация: GNU coreutils
Утилиты работы с текстом
Основная документация: GNU coreutils
cut, tr, tail, head, sort, paste, join, их много…
hexdump из Util-linux
xxd из vim
- …
Комбайны
grep для поиска
sed для поиска с заменой:
$ cal | sed 's/\([01]\)\([2-3]\)/\2:\1/g' Октябрь 22:01 Пн Вт Ср Чт Пт Сб Вс 1 2 3 4 5 6 7 8 9 10 11 2:1 3:1 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
awk (или perl) для написания программ, управляемых контекстом
можно и sed, но…
а можно и любой ЯП. но будет длинно
m4…
- …
Грабли: локаль
Д/З
Прочитать и попробовать всё, что вам покажется релевантным задаче из GNU coreutils, возможно, больше
В репозитории с Д/З сделать (вложенный) подкаталог 04_Text, а в нём — сценарий на shell randomize.sh, который принимает один необязательный параметр — время задержки в секундах (вещественное) перед выводом очередного символа, затем читает со стандартного ввода небольшой файл с ASCII-артом в кодировке ASCII и без символов табуляции, после чего выводит его посимвольно в случайном порядке в левый верхний угол экрана. Должен получиться с виду тот же ASCII-арт (аккуратнее с пробелами).
- Что может понадобиться:
- Перенаправление ввода-вывода
tput (cup и clear, было на лекции) из пакета termutils
Арифметика в shell (конструкция вида $((…)))
Параметры командной строки shell-сценария (конструкция вида $1, $2 и т. п.)
Цикл while в shell
- Условие: нельзя пользоваться другими языками программирования (sed-ом можно, но можно обойтись и без него). В идеале
Необязательное дополнение: скрипт должен выполняться стандартным sehll-ом (не bash, а dash, он же ash, например). Я пока нашёл одну неприятность; встроенное echo в ash не умеет -e — пользуйтесь /bin/echo, оно умеет
Необязательное дополнение: научиться работать с псевдографикой и русскими буквами.
- Проблема: русские буквы в UTF8 занимают два байта, а псевдографика — вообще три
- Решение: сначала перекодировать поток в UCS2, например, там всё будет одинаковое
Необязательное дополнение: выводить ASCII-арт посередине экрана
Проблема (неожиданная): посчитать во входном потоке количество строк и максимальную ширину строки легко, а вот передать эти данные перед тем, как передать остальные, данные просто так не получится
- Решение: использовать временный файл только обязательно удалять его
- Что может понадобиться:
Я решал базовую задачу так (спойлер):
Получилось пока вот что:
Извините, не удержался: