サンプルコマンドを使用
man apropos > outputfile
man
のフォーマットされたapropos
ページを含むテキストファイルが生成されます(太字など、画面に直接印刷されるman apropos
とは少し異なります)。
ただし、生成された出力ファイルの最大行幅を手動で設定して、すべての段落がその幅に揃えられるようにしたいと思います。
man
ページはgroff
を介して作成されます。たとえば、元の.ll 50
man
ソーステキストファイルの段落の前に.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
ターミナルウィンドウのサイズがexport
とman <page> > outputfile
の間で変更されていない場合にのみ、以前と同じ結果が得られます。
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
環境変数を設定してみてください。 man
1.22.3を使用するDebianのmandb
2.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が端末の場合、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
。
fmt
コマンドを使用できます。これは、私の知る限り、どのLinuxディストリビューションにも存在します。
man apropos | fmt -w 70
70文字で行を折り返します。
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'