固定幅でマニュアルページを印刷する


11

コマンド例では

man apropos > outputfile

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

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

manページは次の方法で作成されますgroff。たとえば、.ll 50元の.gz manソーステキストファイルの段落の前に配置しようとしましたが、複数の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 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


私はあなたのinput codeエラーを再現できません195 168 UTF-8である可能性があります。マニュアルページは英語ですか?あなたの男の実装は何ですか?あなたのロケールは何ですか?
ステファンChazelas

システムはUbuntu 14.04です(からのバージョンman manは2.6.7.1)。manページはイタリア語で、UTF-8です。ロケールとはどういう意味ですか?
BowPark 2015

の出力はlocale何ですか?そしてlocale charmap
ステファンChazelas

locale出力:LANG=it_IT.UTF-8 LANGUAGE= LC_CTYPE="it_IT.UTF-8" LC_NUMERIC="it_IT.UTF-8" locale charmap出力:UTF-8
BowPark 2015

1
はいが設定されていないため、機能していない端末からのlessものTERMです。という意味env -i LANG=it_IT.UTF-8 man apropos > output(または| head)。
ステファンChazelas

回答:


18

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

MANWIDTH=60 man apropos > apropos.txt

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

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

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

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


よくできました。COLUMNSも変更したくなかったので、MANWIDTHはRHEL5で問題なく動作します。乾杯。
フェリペアルバレス

1
読者への注記:でexport MANWIDTH=60これを設定する場合は、使用する必要がある場合があります~/.bashrcstackoverflow.com/a/30173376/82216を参照してください。また、Arch wikiでman提案さているように、端末の幅に応じてMANWIDTHを設定する関数でラップすることを検討してください。
sampablokuper 2017

@Marcel M非常に正確な回答をありがとうございます。質問の更新を読み、回答を編集して、基本的な提案を含めてくださいexport MANWIDTH=60
BowPark 2018年

@BowPark export一時的な解決策について尋ねたので、私は答えを書きませんでした:「出力ファイルの作成中に最大行幅を変更するにはどうすればよいですか?」(鉱山を強調)。質問に追加されないため、編集内容を元に戻すこともできます。(コメントの方が適切です。)
Marcel M

@MarcelM実はあなたは正しいです。私はそれに応じて質問を編集しました。exportコメントではほとんど読めない(改行を作成できない)ため、2回目の編集を記述しました。
BowPark 2018年

10

COLUMNS環境変数を設定してみてください。私の作品manからmandbとDebianの上2.7.0.2 groff1.22.3。

$ 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

、そこにman無視するようでCOLUMNS標準入力を端末(それは、端末の幅のための端末機器を照会)であれば、環境変数を。

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

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


同じコマンドを試してみましたCOLUMNS=60 man apropos | headが、残念ながら出力幅はすべて画面の幅です。COLUMNS他の場所や別の方法で変数を設定できますか?
BowPark 2015

2
試してくださいCOLUMNS=60 < /dev/null man apropos | head。Ubuntu 14.04のように見えますがCOLUMNS、stdinが端末であるかどうかを信頼しません(そして端末デバイスから幅を取得します)。
ステファンChazelas

多分それはあなたが思っているようなものです。そして今、それは機能します、ありがとう!
BowPark

4

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

man apropos | fmt -w 70 

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


1
はい私はそれを持っています、ありがとう、それは機能し、かなり便利ですが、正当化されたテキストが必要で、代わりに単に行を折り返します。
BowPark 2015

すみません、その部分は見逃していたに違いありません。
dr01

2

使用できます 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'

1
ありがとう、私はあなたの例を試してみましたが、それらは機能しましたが、-dr01へのコメントに書かれているように-正当なテキストが必要です。
BowPark
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.