Text-Processing
如何 JSON 轉義輸入?
我正在嘗試提出一個工具,用於通過 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 datafile
and交換東西t["test.txt"].content = .
。