2
votes

Comment itérer un tableau JSON dans bash à partir de jq

Contexte

Je veux pouvoir transmettre un fichier json à WP CLI, pour créer de manière itérative des articles.

J'ai donc pensé que je pourrais créer un fichier JSON:

{"post_type":"post","post_title":"Test","post_content":"[leaflet-map][leaflet-marker]","post_status":"publish"}
{"post_type":"post","post_title":"Number
2","post_content":"[leaflet-map
fitbounds][leaflet-circle]","post_status":"publish"}

et itérer le tableau avec jq:

> for i in $(cat posts.json | jq -c .[]); do echo $i; done

Je veux pouvoir les itérer pour exécuter une fonction similaire:

wp post create \
  --post_type=post \
  --post_title='Test Map' \
  --post_content='[leaflet-map] [leaflet-marker]' \
  --post_status='publish'

Est-ce que je peux faire cela avec jq , ou similaire?

Le plus proche que j'ai obtenu jusqu'à présent est celui-ci: p>

cat posts.json | jq --raw-output .[]

Mais cela semble poser problème avec les espaces (valides) dans les chaînes. Résultat:

[
    {
        "post_type": "post",
        "post_title": "Test",
        "post_content": "[leaflet-map][leaflet-marker]",
        "post_status": "publish"
    },
    {
        "post_type": "post",
        "post_title": "Number 2",
        "post_content": "[leaflet-map fitbounds][leaflet-circle]",
        "post_status": "publish"
    }
]

Suis-je loin de cette approche, ou est-ce possible?


1 commentaires

c.f. stedolan.github.io/jq/manual - -c dit explicitement de supprimer les espaces tels que les caractères de nouvelle ligne. Essayez --indent n dans la boucle, mais -c pour générer vos données. Boucle avec pendant la lecture -r i; do echo "$ i" | jq --indent 2 '.'; echo "==="; terminé <<(jq -c '. []' posts.json)


3 Réponses :


3
votes

Utilisez un while pour lire des lignes entières, plutôt que d'itérer sur les mots résultant de la substitution de commande.

while IFS= read -r obj; do
    ...
done < <(jq -c '.[]' posts.json)


1 commentaires

bonne idée. Je ne pourrais pas pour la vie de moi faire fonctionner cela jusqu'à ce que je tombe sur ta solution



1
votes

Peut-être que cela fonctionnerait pour vous:

Créez un exécutable bash, appelez-le peut-être wpfunction.sh

jq -M -c '.[] | [.post_type, .post_title, .post_content, .post_status][]' \
posts.json | xargs -n4 ./wpfunction`

Puis exécutez jq sur votre posts.json et dirigez-le dans xargs

#!/bin/bash

wp post create \
  --post_type="$1"\
  --post_title="$2" \
  --post_content="$3" \
  --post_status="$4"

J'expérimente pour voir comment cela gérerait le post_content contenant des guillemets ...


0 commentaires

1
votes

Commencez par générer un tableau des arguments que vous souhaitez passer puis convertissez-le en une forme compatible avec le shell en utilisant @sh . Ensuite, vous pouvez passer à xargs pour appeler la commande.

$ jq -r '.[] | ["post", "create", (to_entries[] | "--\(.key)=\(.value|tojson)")] | @sh' input.json | xargs wp


0 commentaires