-s строка
Добавить указанную строку в конец каждого номера строки, чтобы отделить его от текста строки. По умолчанию используется один символ табуляции
-v число
Номер первой строки на каждой логической странице. По умолчанию имеет значение 1
-w ширина
Ширина поля номера строки. По умолчанию имеет значение 6
Следует отметить, что на практике нумеровать строки приходится довольно редко, но мы можем использовать nl, чтобы посмотреть, как объединить несколько инструментов для решения более сложных задач. Возьмем за основу наши наработки, созданные в предыдущей главе для получения отчета о дистрибутивах Linux. Поскольку далее мы будем использовать программу nl, включим в текст разметку, отделяющую заголовок/тело/нижний колонтитул. Для этого откройте в текстовом редакторе сценарий для sed из предыдущей главы, добавьте в него строки с разметкой, как показано ниже, и сохраните сценарий в файле с именем distros-nl.sed:
# Сценарий для sed, создающий отчет о дистрибутивах Linux
1 i
\:\:\:
Linux Distributions Report
Name Ver. Released
---- ---- --------
\:\:
s/([0-9]{2})/([0-9]{2})/([0-9]{4})$/3-1-2/
$ a
\:
End Of Report
Новый сценарий вставляет разметку логических страниц для nl и добавляет нижний колонтитул в конец отчета. Обратите внимание, что нам пришлось удвоить символы обратного слеша в разметке, потому что sed обычно интерпретирует их как экранирующие символы.
Теперь выведем улучшенный отчет, объединив sort, sed и nl:
[[email protected] ~]$ sort -k 1,1 -k 2n distros.txt | sed -f distros-nl.sed | nl
Linux Distributions Report
Name Ver. Released
---- ---- --------
1 Fedora 5 2006-03-20
2 Fedora 6 2006-10-24
3 Fedora 7 2007-05-31
4 Fedora 8 2007-11-08
5 Fedora 9 2008-05-13
6 Fedora 10 2008-11-25
7 SUSE 10.1 2006-05-11
8 SUSE 10.2 2006-12-07
9 SUSE 10.3 2007-10-04
10 SUSE 11.0 2008-06-19
11 Ubuntu 6.06 2006-06-01
12 Ubuntu 6.10 2006-10-26
13 Ubuntu 7.04 2007-04-19
14 Ubuntu 7.10 2007-10-18
15 Ubuntu 8.04 2008-04-24
16 Ubuntu 8.10 2008-10-30
End Of Report
Наш отчет является результатом объединения в конвейер нескольких команд. Сначала мы отсортировали список по названиям дистрибутивов и номерам версий (поля 1 и 2), затем обработали результат программой sed, добавив заголовок отчета (включая разметку логических страниц для nl) и нижний колонтитул. В заключение мы обработали результат с помощью программы nl, которая по умолчанию нумерует только строки в потоке текста, принадлежащие разделу с телом логической страницы.
Попробуйте повторить команду и поэкспериментировать с разными параметрами команды nl. Интересный результат, например, можно получить с помощью
nl -n rz
и
nl -w 3 -s ' '
fold — перенос строк после указанной длины
Перенос строк заключается в разрыве текстовых строк по указанной ширине. Подобно другим рассматриваемым командам, fold может принимать одно или несколько имен файлов или данные со стандартного ввода. Если передать команде fold простой поток текста, можно увидеть, как она действует:
[[email protected] ~]$ echo "The quick brown fox jumped over the lazy dog." | fold -w 12
The quick br
own fox jump
ed over the
lazy dog.
Здесь мы видим, как действует программа fold. Текст, посланный командой echo, был разбит на сегменты указанной в параметре -w ширины. В этом примере мы ограничили ширину строк 12 символами. Если ширина не указана, по умолчанию она принимается равной 80 символам. Обратите внимание, что строки были разбиты без учета границ слов. Добавив параметр -s, можно заставить fold разбивать строки по последнему доступному пробелу перед достижением указанной ширины:
[[email protected] ~]$ echo "The quick brown fox jumped over the lazy dog." | fold -w 12 -s
The quick
brown fox
jumped over
the lazy
dog.
fmt — простое форматирование текста
Программа fmt также позволяет выполнить перенос строк плюс кое-что еще. Она принимает файлы или данные со стандартного ввода и формирует абзацы в потоке текста. По сути, она заполняет и объединяет строки, сохраняя пустые строки и отступы.
Для демонстрации нам понадобится некий текст. Возьмем фрагмент из Info-страницы для fmt:
`fmt' читает текст из файла, заданного аргументами FILE (или со
стандартного ввода, если аргументы отсутствуют), и выводит результат
в стандартный вывод.
По умолчанию пустые строки, пробелы между словами и отступы
сохраняются в выводе; последующие строки с разными отступами не
объединяются; символы табуляции на входе заменяются соответствующим
числом пробелов и выводятся в таком виде.
`fmt' старается разбивать строки по концам предложений и стремится
не разрывать строки после первого слова или перед последним
словом в предложении. "Конец предложения" определяется либо по концу
абзаца, либо по слову, завершающемуся любым из символов `.?!', за
которым следуют два пробела или символ перевода строки, любые
скобки или кавычки при этом игнорируются. Подобно TЕX, `fmt' читает
"абзацы" целиком, прежде чем выполнить перенос строк; программа
использует вариант алгоритма, предложенного Дональдом Э. Кнутом
(Donald E. Knuth) и Михаэлем Ф. Плассом (Michael F. Plass) в статье
"Breaking Paragraphs Into Lines", `Software--Practice & Experience'
11, 11 (November 1981), 1119-1184.
Скопируйте этот текст в текстовый редактор и сохраните в файле с именем fmt-info.txt. Теперь представьте, что нам нужно переформатировать этот текст, уместив его в колонку шириной 50 символов. Решить эту задачу можно с помощью команды fmt и ее параметра -w:
[[email protected] ~]$ fmt -w 50 fmt-info.txt | head
`fmt’ читает текст из файла, заданного
аргументами FILE (или со
стандартного ввода, если аргументы отсутствуют),
и выводит результат в стандартный вывод.
По умолчанию пустые строки, пробелы между
словами и отступы
сохраняются в выводе; последующие строки с
разными отступами не объединяются; символы
табуляции на входе заменяются соответствующим.
Результат не особенно впечатляет. Может быть, стоит прочитать этот текст, так как он объясняет происходящее:
По умолчанию пустые строки, пробелы между словами и отступы сохраняются в выводе; последующие строки с разными отступами не объединяются; символы табуляции на входе заменяются соответствующим числом пробелов и выводятся в таком виде.
Итак, fmt сохраняет отступ в первой строке. К счастью, fmt имеет параметр, исправляющий это:
[[email protected] ~]$ fmt -cw 50 fmt-info.txt
`fmt' читает текст из файла, заданного
аргументами FILE (или со стандартного ввода,
если аргументы отсутствуют), и выводит результат
в стандартный вывод.
По умолчанию пустые строки, пробелы между
словами и отступы сохраняются в выводе;
последующие строки с разными отступами не
объединяются; символы табуляции на входе
заменяются соответствующим числом пробелов и
выводятся в таком виде.
`fmt' старается разбивать строки по концам
предложений и стремится не разрывать строки
после первого слова или перед последним
словом в предложении. "Конец предложения"
определяется либо по концу абзаца, либо по
слову, завершающемуся любым из символов `.?!',
за которым следуют два пробела или символ
перевода строки, любые скобки или кавычки при
этом игнорируются. Подобно TeX, `fmt' читает
"абзацы" целиком, прежде чем выполнить перенос
строк; программа использует вариант алгоритма,
предложенного Дональдом Э. Кнутом (Donald
E. Knuth) и Михаэлем Ф. Плассом (Michael
F. Plass) в статье "Breaking Paragraphs Into
Lines", `Software--Practice & Experience' 11,
11 (November 1981), 1119-1184.
Намного лучше. Добавив параметр -c, мы получили желаемый результат.
Программа fmt содержит несколько интересных параметров, которые перечислены в табл. 21.3.
Таблица 21.3. Параметры fmt
Параметр
Значение
-c
Включить режим обработки края (crown margin). В этом режиме сохраняется отступ первых строк абзаца. Последующие строки выравниваются по второй строке
-p строка
Форматировать только строки, начинающиеся со строки, указанной в аргументе. После форматирования содержимое аргумента добавляется в начало каждой переформатированной строки. Этот параметр можно использовать для форматирования текста комментариев в исходном коде. Например, любой сценарий или конфигурационный файл, где комментарии начинаются с символа #, можно обработать командой fmt с параметром -p '# ', чтобы отформатировать только комментарии. Пример приводится ниже
-s
Режим простой разбивки. В этом режиме выполняется только разбивка строк по указанной ширине. Короткие строки не объединяются. Этот режим можно использовать для форматирования исходного кода, когда объединение коротких строк нежелательно
-u
Нормировать пробелы. Этот параметр применяется для форматирования в стандартном «машинописном стиле», то есть когда слова отделяются одним пробелом, а предложения — двумя. Этот режим удобно использовать для удаления выравнивающих пробелов, то есть пробелов, добавленных с целью выравнивания текста по обоим краям