jes*_*e_b 11 sed text-processing github json text-formatting
我正在尝试开发一个工具,用于通过 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"
}
}
Run Code Online (Sandbox Code Playgroud)
该内容显示如下:
#!/bin/sh
# comment
func () {
for ((i=1;i<10;i++)); do
:
done
}
printf '%s\n' Foo bar baz
Run Code Online (Sandbox Code Playgroud)
需要将其转换为:
#!/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
Run Code Online (Sandbox Code Playgroud)
有没有任何工具可以一次性完成此操作?sed如果没有,有谁知道如何使用标准 UNIX 工具来完成它?
注意:原始文本中的任何文字转义序列都需要进行转义,以防止 github 解释它们(但这将是一个次要问题,不一定需要在这个问题中解决,但如果有的话那就太好了) :
IE:
printf '%s\n' Foo bar baz
Run Code Online (Sandbox Code Playgroud)
变成:
printf '%s\\n' Foo bar baz
Run Code Online (Sandbox Code Playgroud)
Mic*_*mer 18
jq -R -s '.' < datafile
Run Code Online (Sandbox Code Playgroud)
这会将所有内容datafile作为字符串读取,然后让 jq 将其作为 JSON 字符串打印出来。它将为您提供一个带引号的字符串,适合直接用其中的内容替换到该模板中datafile。数据将被正确的 JSON 引用,仅使用RFC 7159 转义,并且将位于一大行中,因为 JSON 不允许字符串文字跨越多行。
您还可以使用模板 JSON 文件在 jq 中组装整个文档,
jq --arg f "$(cat datafile)" '.["test.txt"].content = $f' < template.json
Run Code Online (Sandbox Code Playgroud)
最新版本jq有一个--rawfile f datafile选项,您可以使用该选项将文件加载到字符串中,而不是使用命令替换;你也可以用-R --slurp --slurpfile t template.json datafile和交换东西t["test.txt"].content = .。
l0b*_*0b0 12
我必须转义一些 JSON 以包含在其他 JSON 中,并且有一个非常简单的解决方案:
$ jq @json <<< '{"Hello": "World"}'
"{\"Hello\":\"World\"}"
Run Code Online (Sandbox Code Playgroud)