Распечатать фотматированный man

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Ответить
Аватара пользователя
russian_knight
Сообщения: 85

Распечатать фотматированный man

Сообщение russian_knight »

Возникла необходимость распечатать man.

Делаю

man xterm > xterm.txt
получаю файл с переносами строки и ужасными "#", которые стоят перед жирными символами

man xterm | col -b > xterm
получаю файл с переносами строки

Вопрос: как получить man без постоянных переносов строки для нормальной распечатки желаемым размером шрифта?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Распечатать фотматированный man

Сообщение madskull »

Мона попробовать так:

Код: Выделить всё

man xterm | col -b | sed -ne '
/^$/{x;s/[^ ]\-\n//g;s/\n//g;s/\s\+/ /g;s/^/    /;s/$/ \n/;p;d;x}
/^\s/!p
/^\s/{s/^ \+//;H}
' > xterm.txt


Внутри sed'а можно объединить все в одну строку, только надо добавить ; в конце каждой строки.


На перле будет, может быть, красивше, но раз уж я взялся тут всех башу поучать... :)


П.С. Если есть желание - могу расписать, что тут к чему.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
russian_knight
Сообщения: 85

Re: Распечатать фотматированный man

Сообщение russian_knight »

WOW! Прелестно. Спасибо громадное.

Если есть желание, неплохо было бы разобрать ;-)
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Распечатать фотматированный man

Сообщение madskull »

Ну, попробую.

Код: Выделить всё

      1 sed -ne '            
      2 /^$/{            # когда встречается пустая строка - сбрасываем буфер
      3     x                # поменяли местами основной и вспомогательный буфер
      4     s/[^ ]\-\n//g    # убираем переносы
      5     s/\n//g          # убираем переводы строки
      6     s/\s\+/ /g       # заменяем повторяющиеся пробельные символы на один пробел
      7     s/^/    /        # добавляем отступ в начало строки
      8     s/$/ \n/         # добавляем символ новой строки в конец строки
      9     p                # выводим получившуюся строку
     10     d                # очищаем буфер
     11     x                # опять меняем буфера
     12 }
     13 /^\s/!p        # если строка начинается не с пробела - выводим ее
     14 /^\s/{         # если строка начинается с пробела или таба - добавляем ее в буфер
     15     s/^ \+//       # убираем лидирующие пробелы
     16     H              # добавляем строку в конец буфера
     17 }
     18 '


Смысл в том, что у sed'а есть два буфера. В один, основной, попадают обрабатываемые строки. Другой, вспомогательный, может использоваться по усмотрению программиста, содержимое его не меняется. Вот в нем мы и накапливаем строки, которые начинаются с пробельных символов. Затем убираем переводы строк и выводим уже как одну строку.

О том, как понимать запись типа /^\s/!p ,лучше почитать в мануалах.
Если кратко, то команда sed состоит из адреса (номер строки или регэксп, в данном случае /^\s/!), собственно команды (p) и еще могут быть какие-либо данные для команды.

Вот вроде и все. Добавлю еще, что опция -n говорит не выводить найденные строки (мы это делаем сами с помощью команды p. А -e - то что далее последует скрипт более чем с одной командой. Кстати, если не используется -n, то и -e можно опускать.

Ну и о неприятном. На самом деле этот скрипт делает не совсем то, что хотелось бы. То есть он сливает в одну строку все, что начинается с отступа.
А это не есть правильно. Например, вот из этого:

Код: Выделить всё

GNU OPTIONS
       -1, --format=single-column
              List one file per line. This is the default for when standard output is  not
              a terminal.

       -a, --all
              List all files in directories, including all files that start with `.'.

получится не очень красиво:

Код: Выделить всё

GNU OPTIONS
       -1, --format=single-column List one file per line. This is the default for when standard output is  not a terminal.

       -a, --all List all files in directories, including all files that start with `.'.


Как сделать красиво, пока не знаю. С помощью перла это сделать легко. А с помощью только sed'а - врядли. Видимо, придется писать что-то довольно сложное.

Кстати, 15 строка вроде как и не нужна, видимо, забыл убрать, когда перенес все в один блок 3-11.
ArchLinux / IceWM
Спасибо сказали:
chip
Сообщения: 16

Re: Распечатать фотматированный man

Сообщение chip »

(russian_knight @ Пятница, 25 Июня 2004, 10:41) писал(а):Возникла необходимость распечатать man.
Делаю
man xterm > xterm.txt
получаю файл с переносами строки и ужасными "#", которые стоят перед жирными символами
man xterm | col -b > xterm
получаю файл с переносами строки
Вопрос: как получить man без постоянных переносов строки для нормальной распечатки желаемым размером шрифта?

Как вариант:

Код: Выделить всё

man -t xterm > postscript.ps

далее

Код: Выделить всё

gv postscript.ps && lpr postscript.ps
.:ChiP:.

-------------------
:wq
Спасибо сказали:
Ответить