我尝试使用jq解析json文件并在bash脚本中使用它,但我遇到了一些困难。 json
[
{"annonce_id":"123","photos":["url_01"],"titre_slug":"slug1"},
{"annonce_id":"456","photos":["url_11","url_12"],"titre_slug":"slug2"},
{"annonce_id":"7890","photos":["url_31"],"titre_slug":"slug3"},
{"annonce_id":"1234","photos":["url_41"],"titre_slug":"slug4"},
{"annonce_id":"5678","photos":["url_51"],"titre_slug":"slug5"},
{"annonce_id":"90123","photos":["url_61"],"titre_slug":"slug6"}
]
目标: 对于每一行,检索bash变量中的annonce_id,titre_slug和照片。照片应该在一个数组中,因为它可以包含一个或多个元素。
如果我做了
jq -r '.[] | .annonce_id, .titre_slug, .photos'
关于这些数据,我显示了信息,但我希望在bash变量(最好以json字段命名)中使用它,使用annonce_id和titre_slug,并迭代照片。
由于
答案 0 :(得分:1)
bash中有许多可能的解决方案。这是一个不需要mapfile
(又名readarray
)的人:
while read -r annonce
do
read -r titre
IFS=$'\t' read -r -a photos
echo annonce="$annonce"
echo titre="$titre"
echo number of photos is ${#photos[@]}
done < <(jq -r '.[] | .annonce_id, .titre_slug, (.photos | @tsv)' input.json)
答案 1 :(得分:-1)
将值存储在这样的变量中并处理它们
annonce_id=$(jq -r '.[] | .annonce_id')
titre_slug=$(jq -r '.[] | .titre_slug')
# more variables here
答案 2 :(得分:-2)
#!/bin/bash
json_file="/home/pruebas/file.json"
while read line
do
if [ $(echo $line|grep annonce|wc -l) -gt 0 ]
then
var_annonce_id=$(echo $line |grep annonce |awk 'BEGIN {FS="\""}{print $4}')
var_titre_slug=$(echo $line |grep annonce |awk 'BEGIN {FS="\]"}{print $2}' | awk 'BEGIN {FS="\""}{print $4}')
var_photo_array=$(echo $line |grep annonce |awk 'BEGIN {FS="\["}{print $2}' |awk 'BEGIN {FS="\]"}{print $1}' |tr -d "\"" | sed s/"\,"/" "/g )
echo "Annonce_id=$var_annonce_id"
echo "Titre_slug=$var_titre_slug"
echo "Photo Array=$var_photo_array"
fi
done < $json_file