Сценарию можно передать как угодно много имен файлов. Ему нельзя передать исходные данные через конвейер, хотя этот недостаток легко исправляется вызовом команды 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 автоматизирует задачу, используя конструкцию ${# varname }, которая возвращает длину строки, хранящейся в переменной varname .
Листинг 4.3.Сценарий toolong
··#!/bin/bash
··# toolong — передает команде fmt только строки из потока ввода,
··#·· которые длиннее указанного предела
··width=72
··if [! -r "$1"]; then
····echo "Cannot read file $1" >&2
····echo "Usage: $0 filename" >&2
····exit 1
··fi
while read input
··do
····if [${#input} −gt $width]; then
······echo "$input" | fmt
····else
······echo "$input"
····fi
done < $1
··exit 0
Обратите внимание, что простая конструкция < $1 в конце цикла while
подает на его вход указанный файл. Каждая строка из этого файла читается командой read input
и сохраняется в переменной input для дальнейшего анализа.
Если ваша командная оболочка не поддерживает конструкцию ${# var }, ее поведение можно сымитировать очень удобной командой «word count» (счетчик слов) wc:
varlength="$(echo "$var" | wc −c)"
Однако wc имеет один неприятный недостаток: она добавляет ведущие пробелы в свой вывод для выравнивания значений в выходном листинге. Избавиться от этой досадной проблемы можно, внеся небольшие изменения в команду, чтобы оставить в выводе только цифры, как показано ниже:
varlength="$(echo "$var" | wc −c | sed 's/[^[: digit: ]]//g')"
Этот сценарий принимает единственное имя файла, как показано в листинге 4.4.
Листинг 4.4.Тестирование сценария toolong
$ toolong ragged.txt
So she sat on, with closed eyes, and half believed herself in
Wonderland, though she knew she had but to open them again, and
all would change to dull reality-the grass would be only rustling
in the wind, and the pool rippling to the waving of the reeds-the
rattling teacups would change to tinkling sheep-bells, and the
Queen's shrill cries to the voice of the shepherd boy-and the
Читать дальше