如何使用sed等工具替换4GB JSON文件中ISO日期格式,移除毫秒后缀
大体积JSON文件日期格式替换方案
sed 实现方案(优先推荐)
完全可以通过sed实现需求,你已经完成了正则匹配的核心部分,仅需要通过捕获组提取需要保留的内容即可:
注意:你原正则中的
.没有转义,会匹配任意字符,建议转义为\.避免误匹配。
使用扩展正则的易读版本:
sed -E -i.bak 's/([1-9][0-9]{3}-[0-9]{2}-[0-1][0-9]T[0-3][0-9]:[0-9]{2}:[0-9]{2})\.[0-9]{3}Z/\1/g' test.json
参数说明:
-E开启扩展正则支持,不需要对捕获组括号额外加转义符-i.bak直接修改原文件,同时自动生成原文件备份test.json.bak,避免操作错误丢失数据- 捕获组
()包裹的是需要保留的到秒级的日期内容,替换时用\1直接引用该部分,自动丢弃后续的毫秒和Z后缀
如果环境不支持扩展正则,可使用基础正则版本:
sed -i.bak 's/\([1-9][0-9]\{3\}-[0-9]\{2\}-[0-1][0-9]T[0-3][0-9]:[0-9]\{2\}:[0-9]\{2\}\)\.[0-9]\{3\}Z/\1/g' test.json
sed为流式处理,不需要将全量文件加载到内存,处理4GB级文件无性能压力。
备选Python实现方案(更严谨)
如果担心JSON中非日期字段命中正则导致误替换,可以使用Python流式处理方案,内存占用极低,适合大文件操作:
import re import sys # 预编译正则提升匹配效率 date_pattern = re.compile(r'([1-9]\d{3}-\d{2}-[0-1]\dT[0-3]\d:\d{2}:\d{2})\.\d{3}Z') def process_large_file(input_path, output_path): with open(input_path, 'r', encoding='utf-8') as f_in, open(output_path, 'w', encoding='utf-8') as f_out: # 逐行处理,无需加载全量文件到内存 for line in f_in: new_line = date_pattern.sub(r'\1', line) f_out.write(new_line) if __name__ == '__main__': if len(sys.argv) != 3: print("用法: python replace_date.py input.json output.json") sys.exit(1) process_large_file(sys.argv[1], sys.argv[2])
内容的提问来源于stack exchange,提问作者Fazal
相关产品推荐
相关产品推荐

