web-dev-qa-db-fra.com

Comment convertir une réponse json en yaml dans bash

Je lis les données d'un fichier json avec jq. Je veux ajouter les résultats dans un fichier yaml, mais je ne le fais pas fonctionner. Je suis assez nouveau dans la programmation Shell. Mon objectif est d'ajouter ces "utilisateurs" à un tableau "utilisateurs" existant dans un fichier yaml.

Voici mon fichier 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]"]
    }
  ]
  }

Je le filtre avec ça:

cat $DEFAULTS_FILE | jq .users

Je ne sais pas comment convertir ce json en yaml.

Mon résultat attendu devrait être:

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

J'ai essayé d'utiliser un deuxième outil appelé yq qui est similaire à jq et peut écrire des fichiers yaml. Mais je n'ai aucun progrès positif.

MODIFIER

Je sais que je peux ajouter du contenu au yaml avec ça:

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

Mais je ne sais pas comment fusionner mon json en cela.

Toute aide ou indice serait sympa, merci d'avance ...

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())))'
}

Plus d'astuces Bash sur http://github.com/frgomes/bash-scripts

1
Richard Gomes

Un autre oneliner:

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

(exploitant le fait que json valide est également yaml valide)

Et yaml à json:

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