如何批量处理HTML文件,为manifest数组内对象添加统一键值对
嘿,这个批量修改的需求我之前帮不少人解决过,给你分享几个实用的工具和技巧,覆盖不同技术背景的情况:
1. VS Code 多文件正则替换(零代码门槛,首选)
如果你不是程序员,这个方法最省心,不用写脚本,靠编辑器自带功能就能搞定:
- 把所有HTML文件所在的文件夹拖进VS Code
- 按下
Ctrl+Shift+F打开全局搜索替换面板 - 开启正则匹配模式(点击搜索框右侧的
.*按钮) - 关键是写对匹配规则:
假设你的manifest数组是这种格式:
要给每个对象添加var manifest = [ {name: 'Page1', path: '/page1.html'}, {name: 'Page2', path: '/page2.html'} ];newKey: 'fixedValue',可以这么写:- 查找框:
({[^}]+)(})(匹配每个对象的大括号及内部内容) - 替换框:
$1, newKey: 'fixedValue'$2(把键值对插入到对象末尾)
- 查找框:
- 先点击“预览”确认替换结果没问题,再点击“替换全部”
⚠️ 小提示:如果原对象最后已经有逗号,替换时可以去掉逗号,改成 $1 newKey: 'fixedValue'$2,或者用更灵活的正则避免重复逗号。
2. Python 脚本(灵活可控,适合复杂场景)
如果你的manifest数组格式不规整(比如有嵌套对象、注释),正则容易出错,用Python脚本解析更靠谱:
import os import re import json # 定义要添加的键值对 additional_kv = {"newKey": "fixedValue", "priority": 1} # 目标文件夹路径,改成你自己的 target_folder = "./your-html-files" # 遍历所有HTML文件 for filename in os.listdir(target_folder): if not filename.endswith(".html"): continue file_path = os.path.join(target_folder, filename) # 读取文件内容 with open(file_path, 'r', encoding='utf-8') as f: content = f.read() # 匹配并替换manifest数组 def update_manifest(match): arr_str = match.group(1) try: # 把数组字符串转成Python列表 manifest_list = json.loads(arr_str) # 给每个对象添加键值对 for item in manifest_list: item.update(additional_kv) # 转回格式化后的字符串 updated_arr = json.dumps(manifest_list, indent=2) return f"var manifest = {updated_arr};" except Exception as e: print(f"处理文件 {filename} 出错:{str(e)}") return match.group(0) # 出错就保留原内容 # 执行替换(re.DOTALL让.匹配换行) updated_content = re.sub(r'var manifest = (\[.*?\]);', update_manifest, content, flags=re.DOTALL) # 写回文件 with open(file_path, 'w', encoding='utf-8') as f: f.write(updated_content) print(f"已处理:{filename}")
- 注意:如果你的manifest用
const/let定义,或者数组里有注释,需要调整正则和解析逻辑(比如用demjson库处理带注释的JSON)。
3. Node.js 脚本(前端开发者友好)
如果你是前端开发者,用Node.js更顺手,逻辑和Python类似:
const fs = require('fs'); const path = require('path'); // 要添加的键值对 const addKV = { newKey: 'fixedValue', priority: 1 }; // 目标文件夹 const targetDir = './your-html-files'; // 遍历文件 fs.readdirSync(targetDir).forEach(file => { if (path.extname(file) !== '.html') return; const filePath = path.join(targetDir, file); let content = fs.readFileSync(filePath, 'utf8'); // 匹配并更新manifest数组 content = content.replace(/var manifest = (\[.*?\]);/s, (match, arrStr) => { try { const manifestArr = JSON.parse(arrStr); manifestArr.forEach(item => Object.assign(item, addKV)); return `var manifest = ${JSON.stringify(manifestArr, null, 2)};`; } catch (err) { console.error(`处理 ${file} 失败:`, err); return match; } }); fs.writeFileSync(filePath, content, 'utf8'); console.log(`完成:${file}`); });
- 复杂场景下可以用
esprima解析JavaScript AST,精准找到manifest数组的每个对象添加属性,完全避免正则的局限性。
4. 命令行工具(适合Linux/macOS用户)
如果你熟悉命令行,用sed可以快速处理简单格式的文件:
# macOS 版本(注意-i后面的空字符串) sed -i '' 's/{\(.*\)}/{ \1, newKey: "fixedValue" }/g' *.html # Linux GNU sed 版本 sed -i 's/{\(.*\)}/{ \1, newKey: "fixedValue" }/g' *.html
⚠️ 这个方法只适合每个对象单独一行、格式非常规整的情况,否则容易匹配出错。
必看注意事项
- 先备份所有文件:批量操作前一定要复制一份原始文件,避免替换出错无法恢复
- 先测试再批量:找几个典型文件验证替换规则,确认没问题再处理全部文件
- 复杂格式优先用脚本:如果manifest数组有嵌套、注释或者非标准格式,别用正则,用Python/Node.js的解析方法更可靠
内容的提问来源于stack exchange,提问作者Point Clear Media
相关产品推荐
相关产品推荐

