如何通过命令行批量编辑N个HTML模板并移除指定模板块?
批量移除HTML模板中的指定模板块(命令行方案)
这问题我太熟了!要批量清理掉这段带可变空白的模板代码块,用命令行工具sed或者awk就能高效搞定,不用手动一个个改。下面给你两种可靠的方案:
方案一:用sed处理(支持原地修改+备份)
sed的多行匹配能力刚好能应对这种跨多行、空白不固定的场景,直接用这个命令:
sed -i.bak -E '/^\s*{% extends '\''core\/master.html'\'' %}\s*$/,/^\s*{% endblock %}\s*$/{/^\s*{% extends '\''core\/master.html'\'' %}\s*$/{:a;N;/^\s*{% endblock %}\s*$/!ba;s/.*//}}' *.html
命令解释:
-i.bak:关键参数,原地修改HTML文件的同时,自动生成.bak后缀的备份文件,防止误操作搞砸文件-E:启用扩展正则表达式,让匹配语法更简洁/^\s*{% extends ... %}\s*$/,/^\s*{% endblock %}\s*$/:精准匹配从{% extends 'core/master.html' %}行(前后允许任意空白/换行)到最后一个{% endblock %}行的整个代码块- 内部的循环逻辑
:a;N;/.../!ba:会把整个目标代码块的所有行都读入内存,然后一次性替换为空,确保不管中间有多少空白都能彻底清除
方案二:用awk处理(逻辑更直观)
如果你觉得sed的正则有点绕,awk的逻辑会更易懂:
awk '/^\s*{% extends '\''core\/master.html'\'' %}/ {flag=1} flag && /^\s*{% endblock %}/ {flag=0; next} !flag' *.html > temp_all.html && mv temp_all.html *.html
逻辑说明:
- 当匹配到目标代码块的开头行时,设置
flag=1(标记开始跳过内容) - 当
flag=1且匹配到最后一个{% endblock %}行时,设置flag=0并跳过该行 - 只有当
flag=0时,才输出当前行内容(也就是保留非目标块的内容)
实用提醒:
- 先测试再批量执行:先拿一个测试文件跑命令(去掉
-i.bak或者mv步骤),比如sed -E '...' test.html,确认输出正确后再批量处理 - 遍历子目录:如果模板分散在子目录里,用
find命令配合工具:find . -name "*.html" -exec sed -i.bak -E '...' {} + - 清理备份文件:确认所有修改没问题后,用
rm *.html.bak(或者find . -name "*.html.bak" -delete)删除备份
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

