如何在 Bash 中转义 JSON 转换的引号

如何在 Bash 中转义 JSON 转换的引号

我有一个文件需要转换为 JSON 字符串,并且需要通过bash.

我的测试文件看起来像

1
2
'
3
4

这是发生的事情

$ LOG=$(cat file)
$ printf '{"log": "%q"}\n' "$LOG"
{"log": "$'1\n2\n\'\n3\n4'"}

事情看起来不错,就像它正在处理换行符和 一样',但它$'在开头添加了 a,'在结尾添加了 a。

答案1

单引号不需要特殊处理即可包含在 JSON 值中。双引号、换行符、制表符等需要转义或编码。使用 JSON 感知工具来执行此操作是最简单的。我提到jojq以下。


jo log=@file

这用于jo创建具有单个键 的 JSON 文档,log其值将是由文件内容组成的 JSON 编码字符串file

给出问题中数据的输出:

{"log":"1\n2\n'\n3\n4"}

您还可以使用以下方法获取 base64 编码的数据

jo log=%file

(我只是提到这一点,因为它是 的一个巧妙的功能jo)。

输出:

{"log":"MQoyCicKMwo0Cg=="}

使用jq

jq -c -Rs '{ log: . }' file

这会读取原始输入file并将其转换为单个字符串。该字符串用作log输出对象中键的值。

给出问题中的数据的输出:

{"log":"1\n2\n'\n3\n4\n"}

(请注意,最后的换行符保留在此处,但不在输出中jo)。

要获取 Base64 编码的数据(您愿意):

jq -c -Rs '{ log: (.|@base64) }' file

答案2

最简单的是使用三个连续的printf,主要的一个用%s代替%q

$ printf '{"log": "'; printf '%s\\n' $(<file); printf '"}\n'
{"log": "1\n2\n'\n3\n4\n"}

相关内容