将 man 手册转换为 html 文件

将 man 手册转换为 html 文件

用法:在 get_all() 函数的 files 变量中添加要转换的命令,然后直接执行该脚本,就会在同目录下生成一个同名的 .html 文件,打开后就可以借助网页翻译进行查看。

#!/bin/sh

# 需要安装完整版本的 groff 程序
# pkg install groff

get_man_html() {
    # 跳过已经存在的文件
    [ -e "${1}.html" ] && return;

    # -M 指定路径使用英文手册而不是中文,-w 显示手册文件的路径
    local manfile=`man -M /usr/share/man/ -w ${1}`

    # 忽略不存在的 man 文件
    [ -e "${manfile}" ] || continue;

    # 将手册文件解压后,传递给 groff 处理,结果存入 man 目录中
    # -f 表示强制解压,-c 表示结果输出到标准输出,-k 表示不删除原文件
    zcat "${manfile}" |

    # -Thtml 表示转换成 html 格式
    # -Dutf8 表示使用 utf8 编码
    # -man 表示使用传统的手册页样式
    groff -Dutf8 -Thtml -mandoc > "${1}.html"

	# 将连续的空白替换为单个空格,将所有代码合并为一行
	pattern='s/\s\+/ /g'
	
	# 在下列标记之前换行
	# <h0-9><p><table><tr><td><th><br><hr>
	# <html></html><head></head><body></body><style><title><meta>
	pattern="$pattern"';s/<\(!\|h[0-9]\|p\|table\|tr\|td\|th\|br\|hr\|\/\?html\|\/\?head\|\/\?body\|style\|title\|meta\)/\n<\1/g'

	# 去掉内容中的 <b></b><i></i> 标记,不连续的文字会导致 Google 网页翻译不准确
	pattern="$pattern"';s/<\/*\(b\|i\)>//g'

	# 将页面字符集改为 utf8
	pattern="$pattern"';s/charset=US-ASCII/charset=utf8/g'
	
	# 去掉多余的空行
	pattern="$pattern"';s/\n\n\+/\n/g'
	
	# 汉化部分目录
	pattern="$pattern"';s/>NAME<\/a>/>名称<\/a>/g'
	pattern="$pattern"';s/>SYNOPSIS<\/a>/>概要<\/a>/g'
	pattern="$pattern"';s/>DESCRIPTION<\/a>/>描述<\/a>/g'
	pattern="$pattern"';s/>RETURN VALUE<\/a>/>返回值<\/a>/g'
	pattern="$pattern"';s/>ERRORS<\/a>/>错误<\/a>/g'
	pattern="$pattern"';s/>VERSIONS<\/a>/>版本<\/a>/g'
	pattern="$pattern"';s/>CONFORMING TO<\/a>/>遵循<\/a>/g'
	pattern="$pattern"';s/>NOTES<\/a>/>注意<\/a>/g'
	pattern="$pattern"';s/>BUGS<\/a>/>问题<\/a>/g'
	pattern="$pattern"';s/>SEE ALSO<\/a>/>参阅<\/a>/g'
	pattern="$pattern"';s/>COLOPHON<\/a>/>版本记录<\/a>/g'
	pattern="$pattern"';s/>OPTIONS<\/a>/>选项<\/a>/g'
	pattern="$pattern"';s/>ENVIRONMENT<\/a>/>环境变量<\/a>/g'
	pattern="$pattern"';s/>EXIT STATUS<\/a>/>退出状态<\/a>/g'
	pattern="$pattern"';s/>EXAMPLES<\/a>/>示例<\/a>/g'
	pattern="$pattern"';s/>HISTORY<\/a>/>历史<\/a>/g'
	pattern="$pattern"';s/>AUTHOR<\/a>/>作者<\/a>/g'
	pattern="$pattern"';s/>AUTHORS<\/a>/>作者<\/a>/g'
	pattern="$pattern"';s/>FILES<\/a>/>文件<\/a>/g'
	pattern="$pattern"';s/>COPYRIGHT<\/a>/>版权<\/a>/g'
	pattern="$pattern"';s/>REPORTING BUGS<\/a>/>报告错误<\/a>/g'
	pattern="$pattern"';s/>BUG REPORTS<\/a>/>报告错误<\/a>/g'
	pattern="$pattern"';s/>AVAILABILITY<\/a>/>可用性<\/a>/g'
	pattern="$pattern"';s/>COMMANDS<\/a>/>命令<\/a>/g'
	pattern="$pattern"';s/>USAGE<\/a>/>用法<\/a>/g'
	
	# -z 表示使用 NULL 作为换行符,-i 表示直接修改文件
	# s 是正则表达式替换标记,g 表示全部替换
	# ()|+*?/\ 这些字符需要转义
	sed -zi "$pattern" ${1}.html
}

get_all() {
    # 要转换的命令或函数名列表,.2 表示第二章
    files="man groff bash chmod.2"

    for i in ${files}; do
        get_man_html "${i}"
    done
}

get_all

顺便说一下用 sed 对整个文件进行正则表达式替换的方法:

# -z 表示使用 NULL 而不是 \n 作为文件换行符,这样就可以将整个文件作为整体处理
# -i 表示将处理结果直接写回文件,如果没有该参数,则会将结果输出到屏幕
# s/regexpr/replace/g 是将 regexpr 替换为 replace,g 表示替换全部
# 可以用分号分隔多条命令,即替换操作可以执行多次
# 对于组表达式 () 必须对括号进行转移 \(\),其它字符 ()|+?/\ 等也需要转义
sed -z -i 's/regexpr/replace/g;s/regexpr/replace/g' filename
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值