在Bash中将模板文件标记内容替换为指定文件内容
解决sed替换大JSON文件到JS模板的问题
你的问题出在两个核心点:一是200KB的JSON直接通过命令行参数传递,触发了系统的参数列表过长限制;二是JSON里的斜杠、引号、换行等特殊字符会破坏sed的s命令语法,导致未终止的表达式错误。
直接用sed处理大文件或含特殊字符的内容并不合适,推荐用以下两种更可靠的方案:
方案一:使用awk
awk可以直接读取文件内容,无需通过命令行传递大文本,完美规避参数过长和特殊字符问题:
awk ' /INSERT/ { print "const x = " while ((getline line < "insert.json") > 0) { print line } close("insert.json") next } 1' template.js > result.js
命令说明:
- 当匹配到包含
INSERT的行时,先输出const x = - 逐行读取
insert.json的内容并打印 - 跳过原来的
INSERT行(next关键字) - 其他行直接原样输出(
1是awk的简写,代表执行print $0)
方案二:使用Perl
Perl处理含特殊字符的文本更灵活,支持一次性读取整个文件内容:
perl -pe ' if (/INSERT/) { open my $fh, "<", "insert.json" or die $!; local $/; my $json = <$fh>; close $fh; $_ = "const x = $json"; } ' template.js > result.js
命令说明:
-pe参数让Perl逐行处理输入并打印结果- 匹配到
INSERT行时,打开insert.json并一次性读取全部内容(local $/取消行分隔符) - 将当前行替换为
const x =加上读取到的JSON内容 - 其他行保持原样输出
这两个方案都不会把大JSON内容放到命令行参数里,也不需要手动转义特殊字符,完全适配你的场景。
内容的提问来源于stack exchange,提问作者Cyb10101
相关产品推荐
相关产品推荐

