4GB大XML文件批量文本替换高性能实现咨询(sed/Python)
完全可以通过单条sed命令完成全部替换,且sed为流式逐行处理,无需将整个4GB文件加载到内存,性能远高于常规Python脚本,非常适合大文件文本替换场景。
可用命令
注意替换顺序不可调换:优先匹配更长的完整命名空间字符串,再匹配短前缀,避免短字符串提前替换导致长规则匹配失效。
# Linux环境执行,原地修改文件并自动生成.bak后缀的原文件备份 sed -i.bak \ -e 's#xmlns:leif="http://www.leif.org/concatenated-file/header-extension/2.0" xmlns:lei="http://www.leif.org/data/schema/leidata/2016"##g' \ -e 's#xmlns:lei="http://www.leif.org/data/schema/leidata/2016"##g' \ -e 's#lei:##g' \ -e 's#leif:##g' \ target.xml
如果是MacOS环境,不需要备份的话把-i.bak换成-i ''即可。
规则说明
- 命令中使用
#作为sed替换的分隔符,替代默认的/,避免对替换字符串中大量存在的/做转义,降低写错的概率。 - 所有替换规则加了
g标记,会匹配每行内的所有目标文本,不会漏改行内后面的匹配项。 - 规则只会匹配带冒号的
lei:、leif:前缀,不会误改示例中leif_FULL_PUBLISHED这类不带冒号的正文内容。
前置验证
正式执行全文件替换前,可以先取文件前20行做测试,确认输出符合预期再执行全量修改:
head -20 target.xml | sed -e 's#xmlns:leif="http://www.leif.org/concatenated-file/header-extension/2.0" xmlns:lei="http://www.leif.org/data/schema/leidata/2016"##g' -e 's#xmlns:lei="http://www.leif.org/data/schema/leidata/2016"##g' -e 's#lei:##g' -e 's#leif:##g'
确认替换结果无误后再执行带-i参数的原地修改命令即可,替换完成确认文件正常后,可以手动删除生成的.bak备份文件。
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

