[英]How to parse multi properties with spacing in jq json bash script?
我有一个 json 字符串,格式如下:
json='{"x": [{"y":"yyy1", "z":"zzz1 zzz1"}, {"y":"yyy2", "z":"zzz2 zzz2"}]}'
我正在尝试使用 jq 获取所有“y”的数组 var 和单独的“z”数组
y_arr=$(echo "${json}" | jq '.x | [] | .y') # => outputs 2 array elements
y_arr=$(echo "${json}" | jq '.x | [] | .z') # => outputs 4 array elements due to space
你知道如何解决这个问题吗? 另外,您知道将 json 解析为单个键/值数组而不是两个单独的 arrays 的更好方法吗?
假设您的 bash 具有readarray
(又名mapfile
)并且具有 bash 数组值是有效的 JSON 是可以接受的,您可以写:
readarray z_array < <(echo "${json}" | jq -c '.x[] | .z')
使用您的 $json,这将产生一个 JSON 字符串数组(带引号)。
如果您的 shell 不支持readarray
,那么您可以使用 jq 的相同调用但读取 bash 循环中的值,例如:
declare -a array
while read v
do
array+=("$v")
done < <(echo "${json}" | jq -c '.x[] | .z')
如果所有的 .z 值都是 JSON 字符串,那么如果这些字符串没有嵌入的换行符,并且您希望 bash 数组值是“原始”字符串(与 Z0ECD11C1D7A287401D148A2F 字符串相反),您可以添加 BBBBBD -A7401D148A23到 jq 的调用。
如果您的 bash 支持关联 arrays,请考虑:
declare -A a
i=0
while read v
do
i=$((i+1))
a["$v"]=$i
done < <(echo "${json}" | jq -c '.x[].z')
declare -p a
for i in "${!a[@]}" ; do
echo $i
done
这会产生:
declare -A a=(["\"zzz2 zzz2\""]="2" ["\"zzz1 zzz1\""]="1" )
"zzz2 zzz2"
"zzz1 zzz1"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.