如何对输入进行 JSON 转义?

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)