首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将简单连接的json转换为shell变量

将简单连接的json转换为shell变量
EN

Stack Overflow用户
提问于 2021-06-02 20:07:28
回答 1查看 61关注 0票数 2

一些简单的JSON出现了,看起来如下所示。我需要将其转换为shell变量,键应该大写,并且"-“应该转换"_",最后,所有键名都应该放在shell列表中以生成输出,如下所示。我通过一个复杂的jq查询管道成功地做到了这一点,我想知道是否有一种更简单的方法--我jq?注意__INDEX0,__INDEX1,.最终输出中的变量是不需要的。

JSON输入(input.json)

代码语言:javascript
复制
{
  "msg-version": "1.0",
  "msg-type":  "app-config",
  "content": "aaa"
}
{
  "msg-version": "1.0",
  "msg-type":  "app-config",
  "content": "bbb"
}
{
  "msg-version": "1.0",
  "msg-type":  "app-config",
  "content": "ddd",
  "breakit": { "a":"b"}
}

外壳输出

代码语言:javascript
复制
__INDEX0='0'
MSG_VERSION0='1.0'
MSG_TYPE0='app-config'
CONTENT0='aaa'
__INDEX_NAMES0='CONTENT MSG_TYPE MSG_VERSION'
__INDEX1='1'
MSG_VERSION1='1.0'
MSG_TYPE1='app-config'
CONTENT1='bbb'
__INDEX_NAMES1='CONTENT MSG_TYPE MSG_VERSION'
__INDEX2='2'
MSG_VERSION2='1.0'
MSG_TYPE2='app-config'
CONTENT2='ddd'
BREAKIT2='{"a":"b"}'
__INDEX_NAMES2='BREAKIT CONTENT MSG_TYPE MSG_VERSION'

bash jq quer(Ie)

代码语言:javascript
复制
cat input.json|\
jq  'keys as $keys|. + {"__index_names": ($keys|join(" ")|split("-")|join("_")|ascii_upcase)}'|\
jq --slurp 'keys[] as $_k|{ __index: $_k|tostring}*  .[$_k]  '|\
jq -r '.__index as $i|to_entries| .[]| { key: ((.key + $i)|split("-")|join("_")|ascii_upcase), value: (.value) }|.key + "='"'"'" + (.value|tostring) + "'"'"'"')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-02 20:32:54

使用jq命令行选项-n和-r,下面将根据需要生成输出(即,没有多余的__INDEX键):

代码语言:javascript
复制
def q: if type=="string" then @sh else tojson|@sh end;

foreach inputs as $in (-1;.+1;
  . as $n
  | $in
  | to_entries[]
  | "\(.key|gsub("-";"_")|ascii_upcase + ($n|tostring) )=\(.value|q)"
  )

当然,这里的棘手之处是在键名中添加整数后缀。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67811860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档