将 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