shell jq:将json转换为文本

mrphzbgm  于 2023-06-24  发布在  Shell
关注(0)|答案(1)|浏览(143)

下面是json的内容,需要使用jq通过合并外部键和内部键并设置它们的值与内部键相同来创建新的键。

{
  "es": {
    "host": "https://es-host.ap-south-1.es.amazonaws.com",
    "user": "es_admin",
    "pass": "pa$$w0rd"
  },
  "db": {
    "host": "https://db-host.ap-south-1.es.amazonaws.com",
    "user": "db_admin",
    "pass": "pa$$w0rd"
  }   
}

预期输出:

ES_HOST="https://es-host.ap-south-1.es.amazonaws.com"
ES_USER="es_admin"
ES_PASS="pa$$w0rd"

DB_HOST="https://db-host.ap-south-1.es.amazonaws.com"
DB_USER="db_admin"
DB_PASS="pa$$w0rd"

尝试了几个与jq的组合,但无法做到必要的。先谢谢你了。

hs1rzwqc

hs1rzwqc1#

一种方法是使用paths遍历文档,然后使用getpath检索该路径上的值:

jq -r '
  paths(strings) as $path
  | "\($path | map(ascii_upcase) | join("_"))=\(getpath($path) | @json)"
'

Demo
另一种方法是使用to_entries提供的项目中的.key.value,使用两次,因此正好下降两个级别:

jq -r '
  to_entries[] | "\(.key | ascii_upcase)_\(.value
    | to_entries[] | "\(.key | ascii_upcase)=\(.value | @json)"
  )"
'

Demo
输出(根据其用途,您可能需要将@json更改为@sh):

ES_HOST="https://es-host.ap-south-1.es.amazonaws.com"
ES_USER="es_admin"
ES_PASS="pa$$w0rd"
DB_HOST="https://db-host.ap-south-1.es.amazonaws.com"
DB_USER="db_admin"
DB_PASS="pa$$w0rd"

相关问题