web-dev-qa-db-ja.com

json応答をbashでyamlに変換する方法

Jqを使用してjsonファイルからデータを読み取ります。結果をyamlファイルに追加したいのですが、機能しません。私はシェルプログラミングにかなり慣れていません。私の目標は、その「ユーザー」をyamlファイルの既存の「ユーザー」配列に追加することです。

これは私のjsonファイルです:

#$DEFAULTS_FILE

{"users":
  [
    {"name":"pi",
      "gecos": "Hypriot Pirate",
      "Sudo":"ALL=(ALL) NOPASSWD:ALL",
      "Shell": "/bin/bash",
      "groups":"users,docker,video",
      "plain_text_passwd":"pi",
      "lock_passwd":"false",
      "ssh_pwauth":"true",
      "chpasswd": {"expire": false}
    },
    {"name":"admin",
      "gecos": "Hypriot Pirate",
      "Sudo":"ALL=(ALL) NOPASSWD:ALL",
      "Shell": "/bin/bash",
      "primary-group": "users",
      "groups":"users,docker,adm,dialout,audio,plugdev,netdev,video",
      "ssh-import-id":"None",
      "plain_text_passwd":"pi",
      "lock_passwd":"true",
      "ssh_pwauth":"true",
      "chpasswd": "{expire: false}",
      "ssh-authorized-keys": ["ssh-rsa abcdefg1234567890 [email protected]"]
    }
  ]
  }

私はそれでそれをフィルタリングします:

cat $DEFAULTS_FILE | jq .users

そのjsonをyamlに変換する方法はわかりません。

私の期待される結果は:

users:
  - name:                pi
    gecos:               "Hypriot Pirate"
    Sudo:                ALL=(ALL) NOPASSWD:ALL
    Shell:               /bin/bash
    groups:              users,docker,video
    plain_text_passwd:   pi
    lock_passwd:         false
    ssh_pwauth:          true
    chpasswd: { expire:  false }
  - name:                admin
    primary-group:       users
    Shell:               /bin/bash
    Sudo:                ALL=(ALL) NOPASSWD:ALL
    groups:              users,docker,adm,dialout,audio,plugdev,netdev,video
    ssh-import-id:       None

yqに似たjqと呼ばれる2番目のツールを使用して、yamlファイルを書き込もうとしました。しかし、私には前向きな進展はありません。

[〜#〜]編集[〜#〜]

私はそれでコンテンツをyamlに追加できることを知っています:

yq w -i "my.yml" "users[+]" "some content"

しかし、私は私のjsonをそれにマージする方法を知りません。

どんな助けやヒントでもいいでしょう、事前にありがとう...

5
Jan
function yaml_validate {
  python -c 'import sys, yaml, json; yaml.safe_load(sys.stdin.read())'
}

function yaml2json {
  python -c 'import sys, yaml, json; print(json.dumps(yaml.safe_load(sys.stdin.read())))'
}

function yaml2json_pretty {
  python -c 'import sys, yaml, json; print(json.dumps(yaml.safe_load(sys.stdin.read()), indent=2, sort_keys=False))'
}

function json_validate {
  python -c 'import sys, yaml, json; json.loads(sys.stdin.read())'
}

function json2yaml {
  python -c 'import sys, yaml, json; print(yaml.dump(json.loads(sys.stdin.read())))'
}

http://github.com/frgomes/bash-scripts のその他のBashトリック

1
Richard Gomes

別のワンライナー:

python -c 'import yaml, sys; print(yaml.dump(yaml.load(open(sys.argv[1])), default_flow_style=False))' input.json

(有効なjsonも有効なyamlであるという事実を利用する)

そしてjmlにyaml:

python -c 'import yaml, json, sys; print(json.dumps(yaml.load(open(sys.argv[1])), indent=2))' input.yaml
0