Как перебрать массив JSON в bash из jq - PullRequest
0 голосов
/ 02 марта 2019

Фон

Я хочу иметь возможность передавать файл json в WP CLI для итеративного создания сообщений.

Поэтому я подумал, что могу создать файл 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"
    }
]

и итерируйте массив с помощью jq:

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

Я хочу иметь возможность итерировать их для выполнения аналогичной функции:

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

Есть ли способ, которым я могу сделатьэто с jq, или схожим?

Самое близкое, что я получил до сих пор, это:

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

Но, похоже, проблема с (действительными) пробелами в строках,Вывод:

{"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"}

Я не согласен с таким подходом или это можно сделать?

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Может быть, это будет работать для вас:

Сделайте исполняемый файл bash, возможно, назовите его wpfunction.sh

#!/bin/bash

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

Затем запустите jq на вашем posts.json и направьте его вxargs

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

Я экспериментирую, чтобы увидеть, как это будет обрабатывать post_content с кавычками ...

0 голосов
/ 02 марта 2019

Сначала сгенерируйте массив аргументов, которые вы хотите передать, затем преобразуйте в форму, совместимую с оболочкой, используя @sh.Затем вы можете перейти к xargs для вызова команды.

$ jq -r '.[] | ["post", "create", (to_entries[] | "--\(.key)=\(.value|tojson)")] | @sh' input.json | xargs wp
0 голосов
/ 02 марта 2019

Используйте while для чтения целых строк, вместо итерации по словам , полученным в результате подстановки команды.

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