В некоторых реализациях Unix команда cat поддерживает флаг −n, в других команда more (less или pg) имеет флаг, позволяющий указать ей на необходимость вывести номера строк. Но в некоторых разновидностях Unix ни один из предложенных способов не будет работать, и тогда для решения поставленной задачи можно использовать простой сценарий из листинга 4.1.
Код
Листинг 4.1. Сценарий numberlines
#!/bin/bash
# numberlines — простая альтернатива команде cat −n и др.
for filename in "$@"
do
··linecount="1"
··do
····echo "${linecount}: $line"
done
exit 0
Как это работает
Главный цикл в этой программе имеет небольшую хитрость: он выглядит как обычный цикл while, но самой важной его частью является строка done < $filename
Запуск сценария
Сценарию можно передать как угодно много имен файлов. Ему нельзя передать исходные данные через конвейер, хотя этот недостаток легко исправляется вызовом команды cat в отсутствие входных аргументов.
Результаты
В листинге 4.2 показано, как выглядит вывод файла с нумерацией строк, полученный с помощью сценария numberlines.
Листинг 4.2. Тестирование сценария numberlines на выдержке из сказки «Alice in Wonderland» (Алиса в Стране Чудес).
$ numberlines alice.txt
1: Alice was beginning to get very tired of sitting by her sister on the
2: bank, and of having nothing to do: once or twice she had peeped into the
3: book her sister was reading, but it had no pictures or conversations in
4: it, 'and what is the use of a book,' thought Alice 'without pictures or
5: conversations?'
6:
7: So she was considering in her own mind (as well as she could, for the
8: hot day made her feel very sleepy and stupid), whether the pleasure
9: of making a daisy-chain would be worth the trouble of getting up and
10: picking the daisies, when suddenly a White Rabbit with pink eyes ran
11: close by her.
Усовершенствование сценария
Получив содержимое файла с пронумерованными строками, вы легко сможете изменить порядок их следования на противоположный, как показано ниже:
cat −n filename | sort −rn | cut −c8-
Такая команда будет работать в системах, где команда cat поддерживает флаг −n. Для чего это может пригодиться? Например, для вывода содержимого файла журнала в обратном порядке следования записей — от новых к старым.
№ 28. Перенос длинных строк
Одно из ограничений команды fmt и эквивалентного ей сценария № 14 из главы 2 состоит в том, что они переносят и оформляют отступы во всех строках, которые встретятся им на пути, даже если в этом нет никакого смысла. В результате текст электронного письма может превратиться в абракадабру (например, перенос слова. signature — не самое лучшее решение), как и содержимое любого другого файла, где переносы строк играют важную роль.
А что, если вам потребуется реализовать перенос только очень длинных строк в документе, оставив все остальное нетронутым? С набором команд, доступным пользователю Unix по умолчанию, остается только одно: вручную просмотреть все строки в редакторе, по отдельности передавая длинные команде fmt. (В редакторе vi для этого достаточно установить курсор на требуемую строку и выполнить команду!$fmt.)
Сценарий в листинге 4.3 автоматизирует задачу, используя конструкцию ${#
Код
Листинг 4.3. Сценарий toolong
··#!/bin/bash
··# toolong — передает команде fmt только строки из потока ввода,