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

# Этот файл содержит код с комментариями.

# Эта строка - комментарий. За ней следует другая

# строка с комментарием. И еще одна.

Это не комментарий, а строка с кодом.

Еще одна строка с кодом.

И еще.

Обратите внимание, что смежные строки комментариев были объединены, а пустые строки и строки, не начинающиеся с указанного префикса, остались нетронутыми.