10. 如何获取不带 ^H^_ 乱码的纯文本 man 手册页?

请查看col(1),因为它col可以过滤掉退格序列。如果您等不及那么久

funnyprompt$ groff -t -e -mandoc -Tascii manpage.1 | col -bx > manpage.txt

选项-t-e告诉groff使用tbleqn进行预处理。对于不需要预处理的 man 手册页来说,这有点过度,但除了浪费一些 CPU 周期外,没有坏处。另一方面,当实际需要时,不使用-t则会造成损害:表格的格式会非常糟糕。您甚至可以找出(或者更确切地说,是“猜测”)格式化特定groff文档(不仅仅是 man 手册页)所需的命令,通过执行

funnyprompt$ grog /usr/man/man7/signal.7
groff -t -man /usr/man/man7/signal.7

“Grog”代表 “GROff Guess”,顾名思义,它会进行猜测。如果它是完美的,我们就再也不需要选项了。我见过它在宏包和预处理器上猜测错误。这是我编写的一个小型 perl 脚本,可以删除页面页眉和页脚,从而在打印冗长而精细的 man 手册页时为您节省几页纸(并为大自然母亲节省一棵树)。将其保存在名为strip-headers& chmod 755 的文件中。

    #!/usr/bin/perl -wn
    #  make it slurp the whole file at once:
    undef $/;
    #  delete first header:
    s/^\n*.*\n+//;
    #  delete last footer:
    s/\n+.*\n+$/\n/g;
    #  delete page breaks:
    s/\n\n+[^ \t].*\n\n+(\S+).*\1\n\n+/\n/g;
    #  collapse two or more blank lines into a single one:
    s/\n{3,}/\n\n/g;
    #  see what's left...
    print;

您必须将其用作man命令之后的第一个过滤器,因为它依赖于groff输出的换行符数量。例如

funnyprompt$ man bash | strip-headers | col -bx > bash.txt