Возникла необходимость распечатать man.
Делаю
man xterm > xterm.txt
получаю файл с переносами строки и ужасными "#", которые стоят перед жирными символами
man xterm | col -b > xterm
получаю файл с переносами строки
Вопрос: как получить man без постоянных переносов строки для нормальной распечатки желаемым размером шрифта?
Распечатать фотматированный man
Модератор: Модераторы разделов
Re: Распечатать фотматированный man
Мона попробовать так:
Внутри sed'а можно объединить все в одну строку, только надо добавить ; в конце каждой строки.
На перле будет, может быть, красивше, но раз уж я взялся тут всех башу поучать...
П.С. Если есть желание - могу расписать, что тут к чему.
Код: Выделить всё
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
WOW! Прелестно. Спасибо громадное.
Если есть желание, неплохо было бы разобрать ;-)
Если есть желание, неплохо было бы разобрать ;-)
Re: Распечатать фотматированный man
Ну, попробую.
Смысл в том, что у sed'а есть два буфера. В один, основной, попадают обрабатываемые строки. Другой, вспомогательный, может использоваться по усмотрению программиста, содержимое его не меняется. Вот в нем мы и накапливаем строки, которые начинаются с пробельных символов. Затем убираем переводы строк и выводим уже как одну строку.
О том, как понимать запись типа /^\s/!p ,лучше почитать в мануалах.
Если кратко, то команда sed состоит из адреса (номер строки или регэксп, в данном случае /^\s/!), собственно команды (p) и еще могут быть какие-либо данные для команды.
Вот вроде и все. Добавлю еще, что опция -n говорит не выводить найденные строки (мы это делаем сами с помощью команды p. А -e - то что далее последует скрипт более чем с одной командой. Кстати, если не используется -n, то и -e можно опускать.
Ну и о неприятном. На самом деле этот скрипт делает не совсем то, что хотелось бы. То есть он сливает в одну строку все, что начинается с отступа.
А это не есть правильно. Например, вот из этого:
получится не очень красиво:
Как сделать красиво, пока не знаю. С помощью перла это сделать легко. А с помощью только sed'а - врядли. Видимо, придется писать что-то довольно сложное.
Кстати, 15 строка вроде как и не нужна, видимо, забыл убрать, когда перенес все в один блок 3-11.
Код: Выделить всё
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
Re: Распечатать фотматированный man
(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
-------------------
:wq