我有一个文件需要转换为 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 感知工具来执行此操作是最简单的。我提到jo
和jq
以下。
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"}