web-dev-qa-db-ja.com

固定幅でmanページを印刷する

サンプルコマンドを使用

man apropos > outputfile

manのフォーマットされたaproposページを含むテキストファイルが生成されます(太字など、画面に直接印刷されるman aproposとは少し異なります)。

ただし、生成された出力ファイルの最大行幅を手動で設定して、すべての段落がその幅に揃えられるようにしたいと思います。

manページはgroffを介して作成されます。たとえば、元の.ll 50manソーステキストファイルの段落の前に.gzを付けようとしましたが、しかし、いくつかのmanページで作業する必要がある場合、それは簡単です。さらに、すべての文字が認識されるわけではありません。

apropos.1:45: warning: can't find character with input code 195
apropos.1:45: warning: can't find character with input code 168
apropos.1:47: warning: can't find character with input code 178
apropos.1:131: warning: can't find character with input code 169

なので、もっと簡単な方法はあるのでしょうか。 outputfileの作成中に、最大線幅を変更するにはどうすればよいですか?特定のコマンドはありますか?


編集

(以下の考慮事項はすべてUbuntu 18.04に関するものです。上記の質問の14.04を含め、以前のバージョンではテストできなくなりました。)

1行の一時的な解決策に関しては、MANWIDTHがカスタム値でまだエクスポートされていない場合、違いはありません。

$ MANWIDTH=60 man apropos > outputfile

そして

$ COLUMNS=60 man apropos > outputfile

ただし、最初の方法はMANWIDTHを使用しますが、原則としてはより優れています。


編集2(厳密には質問とは関係ありません):

代わりに、任意のマンページ印刷に適用される永続的な幅設定を作成するには、変数の目的の値exportにする必要があります。と:

$ export MANWIDTH=60
# zero or more additional lines
$ man apropos > outputfile

man aproposは、ターミナルウィンドウのサイズ変更に関係なく、同じ幅で印刷されます。代わりに、

$ export COLUMNS=60
# zero or more additional lines
$ man apropos > outputfile

ターミナルウィンドウのサイズがexportman <page> > outputfileの間で変更されていない場合にのみ、以前と同じ結果が得られます。

11
BowPark

MANWIDTH環境変数を使用します。

MANWIDTH=60 man apropos > apropos.txt

Man 2.7.4のマンページにはこう書かれています:

$ MANWIDTHが設定されている場合、その値は、マニュアルページをフォーマットする必要がある行の長さとして使用されます。設定されていない場合、マニュアルページは現在の端末に適した行長でフォーマットされます($ COLUMNSの値、使用可能な場合はioctl(2)を使用するか、どちらも使用できない場合は80文字にフォールバックします)。

つまり、COLUMNSioctlの両方の値をオーバーライドします。ウィンドウサイズが変更されるたびに値が動的に更新されるため、COLUMNSの変更に依存しないことを好みます(ここでは機能しますが)。

MANWIDTHの代わりにCOLUMNSを使用すると、シェル起動ファイルにexport MANWIDTH=60などの行を追加して、変更を永続的にすることもできます。

19
Marcel M

COLUMNS環境変数を設定してみてください。 man1.22.3を使用するDebianのmandb2.7.0.2のgroffで動作します。

$ COLUMNS=60 man apropos | head
APROPOS(1)          Manual pager utils          APROPOS(1)



NAME
       apropos - search the manual page names and descrip‐
       tions

SYNOPSIS
       apropos [-dalv?V] [-e|-w|-r]  [-s  list]  [-m  sys‐
$ COLUMNS=70 man apropos | head
APROPOS(1)               Manual pager utils               APROPOS(1)



NAME
       apropos - search the manual page names and descriptions

SYNOPSIS
       apropos  [-dalv?V] [-e|-w|-r] [-s list] [-m system[,...]] [-M
       path] [-L locale] [-C file] keyword ...

Ubuntu 14.04のバージョンでは、次のように記述する必要があります。

COLUMNS=60 < /dev/null man apropos | head

そこで、stdinが端末の場合、manCOLUMNS環境変数を無視しているようです(端末デバイスに端末の幅を問い合わせます)。

あなたも試すことができます:

s=$(stty -g); stty cols 60; man apropos | head; stty "$s"

zshを使用すると、次のように短縮できます。

STTY='cols 60' man apropos | head

次のように手動でgroffを呼び出すことで実行できます。

gzip -dcf "$(man -w apropos)" |
  groff -ekpstR -mtty-char -mandoc -Tutf8 -rLL=60n |
  col -bpx

入力コードで文字が見つかりませんエラーは、-Tasciiではなく-Tutf8を使用し、-kを使用してファイルを前処理しなかったために発生しましたpreconv

10

fmtコマンドを使用できます。これは、私の知る限り、どのLinuxディストリビューションにも存在します。

man apropos | fmt -w 70 

70文字で行を折り返します。

4
dr_

foldを使用できます

man cp | fold -w 20

20文字(!)ごとに折りたたまれます。唯一のオプションは「20文字ごとに折りたたむ」であるため、これにより単語が2つにカットされることに注意してください。

これを処理すると、次のようにsedを使用できます(動的な行の長さ)

man cp | sed 's/.\{20\} /&\n/g'

20個のランダムな文字の後にスペースが続く改行(つまり、新しい単語)が追加されます。したがって、行は20文字より長くなる可能性があります(一致は20文字、次にスペースであるため、26文字の単語は26文字の行になります)

sedコマンドの最後のスペースを省略するには:

sed 's/\(.\{20\}\) /\1\n/g'
2
Fiximan