Text-Processing

如何 JSON 轉義輸入?

  • August 24, 2021

我正在嘗試提出一個工具,用於通過 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
jq -R -s '.' < datafile

這將全部作為字元串讀取datafile,然後讓 jq 將其列印為 JSON 字元串。它會給你一個帶引號的字元串,適合直接用其中的內容替換該模板datafile。數據將正確地被 JSON 引用,僅使用RFC 7159 轉義,並且將在一個大行中,因為 JSON 不允許字元串文字跨越多行。


您還可以使用模板 JSON 文件在 jq 中組裝整個文件,然後

jq --arg f "$(cat datafile)" '.["test.txt"].content = $f' < template.json

最新版本jq有一個--rawfile f datafile選項,您可以使用該選項將文件載入到字元串中,而不是命令替換;你也可以用-R --slurp --slurpfile t template.json datafileand交換東西t["test.txt"].content = .

引用自:https://unix.stackexchange.com/questions/548892