我是 shell 脚本编写和脚本工作的新手。其中我需要创建一个 html 报告并将此 html 报告内容附加到提交的 json 请求中。然后我们使用该请求来调用 API。
我有 Json 请求作为模板,模板中有一个名为 CONTENT 的占位符,其中我必须在使用 base64 对其进行编码后替换生成的 HTML 内容。
当我尝试使用 AWK 和 sed 在模板中添加编码字符串时,出现 Argument list is too long 错误。因为我生成的 HTML 文件有 40K 行。
通过以下方法,我遇到了同样的错误。
encStr="$(cat ./myreport.html | base64)"
#AWK-Approach
awk -v var="$encStr" '{gsub("CONTENT", var, $0); print}' /path/totemplate > output.tmp
#SED-Approach
sed -i "s|CONTENT|$encStr|" output.tmp
建议将 sed 更改为 ed 并将命令放在单独的文件中。按照https://unix.stackexchange.com/a/284188/149867但是当我创建一个单独的 .sh 文件并将其包含在我当前的脚本中时,它不起作用。此方法或任何其他方法的任何详细示例。
答案1
如果CONTENT
在自己的行上,则将替换内容放入文件中tmp
,然后使用
sed -e '/CONTENT/r tmp' -e '/CONTENT/d' inp
tmp
首先在匹配后插入文件的内容,然后删除该行CONTENT
(@philippos 评论中的答案对我不起作用,必须在匹配后注入文件,然后删除匹配)
答案2
您已经在使用临时文件 output.tmp
而不是试图将所有内容全部保存在内存中然后对其进行修改(即读取模板然后替换占位符)
我会尝试按照输出中需要的顺序将这些部分写入临时文件。
即使用您生成的任何语言将 JSON 请求模板的第一部分写入 output.tmp。
然后base64 ./myreport.html >> output.tmp
附加内容,
然后将 JSON 请求模板的其余部分附加到 output.tmp 内容之后。
无需替换,所需内存少得多。您不需要 sed 或 awk 来完成此任务,它们都是用于操作数据的编程语言,并且您实际上不需要操作任何东西。
另外,避免不必要地使用猫。它用于连接文件。由于其读取文件并按原样显示的默认行为,它被过度使用。您不需要 cat 来为您打开文件。由于 base64 可以从 STDIN(例如在管道中)读取其输入,因此它还可以读取文件:
cat ./myreport.html | base64
写得更好base64 ./myreport.html