如何替换文件中的大子串?解决sed参数过长问题
解决sed替换大字符串时"argument list too long"的问题
问题原因
你遇到的argument list too long错误,是因为subStr或sortSub内容过大,导致bash传递给sed的命令行参数长度超过了系统的ARG_MAX限制(系统允许的最大命令行参数总长度)。直接在sed命令行中嵌入超大字符串会触发这个限制。
可行解决方案
方案1:用awk处理(推荐)
awk可以通过环境变量读取大变量,无需将超大字符串直接作为命令行参数传递,完美绕过参数长度限制:
- 先将变量导出为环境变量,让awk能访问:
export subStr sortSub
- 用awk执行替换并覆盖原文件:
awk '{gsub(ENVIRON["subStr"], ENVIRON["sortSub"]); print}' file > temp_file && mv temp_file file
gsub会在每一行中全局替换所有匹配subStr的内容为sortSub- 先输出到临时文件再替换原文件,是为了避免awk直接修改原文件时出现的内容损坏问题
方案2:用sed读取脚本文件
把替换规则写入临时脚本文件,让sed读取脚本而非直接在命令行传递大字符串:
- 创建sed脚本文件:
echo "s?$subStr?$sortSub?" > sed_replace.sed
- 如果你的
subStr或sortSub中包含?(当前用的分隔符),需要先对这些字符转义,或者换成其他不冲突的分隔符(比如|)
- 执行sed替换:
sed -i -f sed_replace.sed file
- 清理临时脚本:
rm sed_replace.sed
内容的提问来源于stack exchange,提问作者Alan Gatsby
相关产品推荐
相关产品推荐

