纯文本转html需一行命令或三行脚本,须规避编码、换行、xss三类坑:先用tr清理\r,再用sed加标签;awk分段更可靠但macos需gawk;pandoc需显式指定-f markdown并禁用--standalone;中文文件须iconv转utf-8;转义必须用html.escape()。

纯文本转 HTML 不需要“格式化工具”,真正要的是一行命令或三行脚本,且必须避开编码、换行、XSS 三类坑。
sed 一行转
标签但空行失效?先清理 \r 再分段
Linux/macOS 下直接 sed 's/^/<p>/; s/$//' input.txt</p> 看似快,实际在 Windows 编辑的文本上会崩——\r\n 中的 \r 会混进标签里,浏览器渲染出 <p>内容\r</p>,导致段落粘连。
- 必须先清理换行符:
tr -d '\r' /; s/$//' > output.html - 若原文靠空行分段,
awk更可靠,但 macOS 自带awk对中文支持差,改用gawk:gawk '/^$/ {print "<p>"; next} {print}' input.txt | sed '1s/^/</p> <p>/; $s/$//' > output.html</p><div class="aritcle_card flexRow artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher"><img src="https://img.php.cn/upload/skill/000/000/081/179109368394970.jpg" alt="Wechat HTML Publisher" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="overflowclass">Wechat HTML Publisher</a> <p class="overflowclass">直接上传HTML富文本到微信公众号草稿箱。支持完整的HTML格式,无需Markdown转换。</p> </div> <a rel="nofollow" href="/xiazai/skill6712" title="Wechat HTML Publisher" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a> </div> </div> - 别漏加 HTML 外壳,否则浏览器可能以 quirks mode 渲染:
echo "<meta charset='\"utf-8\"'>" > output.html && tr -d '\r' /; s/$//' >> output.html && echo "" >> output.html
pandoc 转带标记文本却输出全页?关掉 --standalone 并指定输入格式
你写的是 # 标题 和 - 列表,但 pandoc input.txt -o output.html 输出一堆 <title></title> ——因为 pandoc 默认把纯文本当“无格式文本”处理,# 不被识别为标题;而加了 --standalone 又强制包完整 HTML 结构。
- 明确告诉 pandoc 这是 Markdown:
pandoc -f markdown -t html --standalone=false input.txt -o output.html - 如果只要 body 内容(比如嵌入到已有网页),去掉
--standalone=false不够,还得用空模板:pandoc -f markdown -t html --template=/dev/null input.txt -o output.html - 中文文件报编码错?不是 pandoc 问题,是文件本身存成 GBK:
iconv -f GBK -t UTF-8 input.txt | pandoc -f markdown -t html --template=/dev/null > output.html
Python 脚本手写转义却出现 &?永远用 html.escape(),别自己 replace
有人写 line.replace('&', '&').replace(',结果 <code><code>& 变成 <code>&,页面显示全是文字实体——这是典型未区分原始内容与已转义内容的后果。
- 只用标准库:
from html import escape; escaped = escape(line),它自动处理引号、Unicode 边界和嵌套情况 - 如果后续要放进
<pre class="brush:php;toolbar:false;"></pre>,记得保留换行:escaped.replace('\n', '<br>')或直接用<pre class="brush:php;toolbar:false;">{escaped}</pre>(<pre class="brush:php;toolbar:false;"></pre>本身保留空白) - 别用
str.replace('\n', '<p>')</p>拆段落——空行会被忽略,且首尾段落缺标签;改用text.splitlines(keepends=False)+ 循环拼接
Word 文档别用 sed/awk/pandoc?它们根本读不懂 .docx 二进制结构
看到 .docx 文件就下意识扔进 pandoc 或写 Python 读取字符串?.docx 是 ZIP 包,里面是 XML,直接读文件内容只会拿到乱码或报错。shell 命令和纯文本工具对它完全无效。
- 真要本地批量转,用专解 Word 结构的工具:如
Word2Htm(免安装、不调 Word、输出语义 HTML)、或python-docx库解析后手动映射标签 - 在线工具或 WPS “另存为网页” 会调用 Office 引擎,能保排版但不可控输出——比如插入 37 行
<p></p>,你得再写正则删 - 最稳的离线方案其实是 Pandoc + docx:它内部用 zip 解压 + xml 解析,但要求系统装有 pandoc 3.1+,旧版不支持 docx 输入格式
真正难的不是“怎么转”,而是判断输入文本有没有隐含结构、要不要保语义、是否跨平台显示——这些决定了你该敲哪一行命令,而不是找哪个“一键工具”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










