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:
[me@linuxbox ~]$ fmt -w 50 fmt-info.txt | head
`fmt’ читает текст из файла, заданного
аргументами FILE (или со
стандартного ввода, если аргументы отсутствуют),
и выводит результат в стандартный вывод.
По умолчанию пустые строки, пробелы между
словами и отступы
сохраняются в выводе; последующие строки с
разными отступами не объединяются; символы
табуляции на входе заменяются соответствующим.
Результат не особенно впечатляет. Может быть, стоит прочитать этот текст, так как он объясняет происходящее:
По умолчанию пустые строки, пробелы между словами и отступы сохраняются в выводе; последующие строки с разными отступами не объединяются; символы табуляции на входе заменяются соответствующим числом пробелов и выводятся в таком виде.
Итак, fmt сохраняет отступ в первой строке. К счастью, fmt имеет параметр, исправляющий это:
[me@linuxbox ~]$ 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
Нормировать пробелы. Этот параметр применяется для форматирования в стандартном «машинописном стиле», то есть когда слова отделяются одним пробелом, а предложения — двумя. Этот режим удобно использовать для удаления выравнивающих пробелов, то есть пробелов, добавленных с целью выравнивания текста по обоим краям
-w ширина
Форматировать текст по указанной ширине. По умолчанию используется ширина 75 символов. Обратите внимание: в действительности fmt форматирует строки немного короче, чем указано в аргументе, чтобы обеспечить сбалансированность ширины текста
Особый интерес представляет параметр -p. С его помощью можно форматировать выбранные фрагменты файла, гарантировав, что все отформатированные строки будут начинаться с одной и той же последовательности символов. Многие языки программирования поддерживают комментарии, начинающиеся с символа решетки (#), и такие комментарии можно форматировать с помощью этого параметра. Давайте создадим файл, имитирующий исходный текст программы с комментариями:
[me@linuxbox ~]$ cat > fmt-code.txt
# Этот файл содержит код с комментариями.
# Эта строка - комментарий.
# За ней следует другая строка с комментарием.
# И еще одна.
Это не комментарий, а строка с кодом.
Еще одна строка с кодом.
И еще.
Файл примера содержит комментарии, начинающиеся со строки # (символ # и пробел), и строки «кода». Теперь воспользуемся командой fmt, чтобы отформатировать комментарии и при этом не затронуть код:
[me@linuxbox ~]$ fmt -w 50 -p '# ' fmt-code.txt
# Этот файл содержит код с комментариями.
# Эта строка - комментарий. За ней следует другая
# строка с комментарием. И еще одна.
Это не комментарий, а строка с кодом.
Еще одна строка с кодом.
И еще.
Обратите внимание, что смежные строки комментариев были объединены, а пустые строки и строки, не начинающиеся с указанного префикса, остались нетронутыми.