我正在尝试提出一个工具,用于通过 API 将数据发送到 github gist。问题是 github api 将要点content
作为一行,所有转义序列都按字面写出,如下所示:
{
"test.txt": {
"filename": "test.txt",
"type": "text/plain",
"language": "Shell",
"raw_url": "https://gist.githubusercontent.com/jessebutryn/5c8b2a95b4b016e2fa33edee294c732b/raw/474f72ad32c843c18e9a61a228a31df6b85a8da1/test.txt",
"size": 96,
"truncated": false,
"content": "#!/bin/sh\n\n# comment\nfunc () {\n\tfor ((i=1;i<10;i++)); do\n\t\t:\n\tdone\n}\n\nprintf '%s\\n' Foo bar baz\n"
}
}
该内容显示如下:
#!/bin/sh
# comment
func () {
for ((i=1;i<10;i++)); do
:
done
}
printf '%s\n' Foo bar baz
其中需要转换为:
#!/bin/sh\n\n# comment\nfunc () {\n\tfor ((i=1;i<10;i++)); do\n\t\t:\n\tdone\n}\n\nprintf '%s\\n' Foo bar baz\n
是否有任何工具可以一次性完成此操作?如果没有,是否有人知道如何使用sed
或任何标准的 unix 工具来完成它?
注意:原始文本中的任何文字转义序列都需要转义以防止 github 解释它们(但是这将是次要问题,不一定需要在这个问题中解决,但会很高兴) :
IE:
printf '%s\n' Foo bar baz
变成:
printf '%s\\n' Foo bar baz
这将全部作为字符串读取
datafile
,然后让 jq 将其打印为 JSON 字符串。它会给你一个带引号的字符串,适合直接用其中的内容替换该模板datafile
。数据将正确地被 JSON 引用,仅使用RFC 7159 转义,并且将在一个大行中,因为 JSON 不允许字符串文字跨越多行。您还可以使用模板 JSON 文件在 jq 中组装整个文档,然后
最新版本
jq
有一个--rawfile f datafile
选项,您可以使用该选项将文件加载到字符串中,而不是命令替换;你也可以用-R --slurp --slurpfile t template.json datafile
and交换东西t["test.txt"].content = .
。我不得不转义一些 JSON 以包含在其他 JSON 中,并且有一个非常简单的解决方案:
如果您有一个现有的 JSON 文档,
file.json
并且只想将内容插入到正确的位置,请使用jq
,如果内容应该是 base64 编码:
从头开始构建 JSON,使用(从和
jo
的输出中近似元数据):stat
file
根据您的 Unix调整
stat
和实用程序(以上使用 Linux 选项)。file
输出:
使用
%"$filename"
in@"$filename"
来获取content
key 的 base64 编码值: