在Bash/JQ中将JSON转换为单引号包裹的字符串
解决方案
最优方案:使用JQ的@sh过滤器
@sh过滤器专门用于生成符合shell语法的字符串,会自动用单引号包裹内容,且保留原始JSON中的双引号不转义,完全匹配需求。
示例命令:
# 原始输入字符串(包含带双引号的value) echo 'key1:value1,key2:"value with double quotes"' | jq -R ' # 第一步:将key:value格式的字符串转换为JSON对象 split(",") | map(split(":"; 1) | {(.[0]): .[1]}) | add # 第二步:用@sh生成单引号包裹的字符串 | @sh '
输出结果:
'{"key1":"value1","key2":"value with double quotes"}'
替代方案1:Shell环境中直接包裹输出
如果不需要在JQ内部完成单引号包裹,可以在shell中直接捕获JQ的JSON输出,手动添加前后单引号:
echo "'$(echo 'key1:value1,key2:"value with double quotes"' | jq -R 'split(",") | map(split(":"; 1) | {(.[0]): .[1]}) | add')'"
替代方案2:JQ内手动处理转义并拼接单引号
如果无法使用@sh(比如旧版本JQ不支持),可以先将JSON对象转为字符串,替换掉自动转义的双引号,再拼接单引号:
echo 'key1:value1,key2:"value with double quotes"' | jq -R ' split(",") | map(split(":"; 1) | {(.[0]): .[1]}) | add | tostring | gsub("\\\\\""; "\"") | "'"'"'" + . + "'"'"'" '
注:'"'"'是shell中插入单引号的写法,用于在JQ的字符串表达式中表示单引号。
内容的提问来源于stack exchange,提问作者Faisal
相关产品推荐
相关产品推荐

