linux 从jq填充bash数组(包含空格的项的数组)[duplicate]

qrjkbowd  于 2023-01-01  发布在  Linux
关注(0)|答案(2)|浏览(165)
    • 此问题在此处已有答案**:

Assigning jq output to bash array when json value contains spaces(2个答案)
20小时前关门了。
我决定写一个小的bash解析器脚本,我在bash和jq方面有点成功,所以我用curl从reddit和jq中获取json,从中提取值,我想以句子列表的形式获取标题,最好的方法是什么?

    • 代码示例**
#getting title
titles=($(echo "${json}" | jq '.data.children[].data.title'))
echo "full list is"
echo ${titles[@]}
echo

#copyed by hand from previos output^ 
hand_titles=("Developers Should Celebrate Software Development Being Hard" "Lies we tell ourselves to keep using Golang")

echo "I want to call var like this and get this output:"
echo ${hand_titles[0]}
echo
echo "But instead I get this: "
echo ${titles[0]}
    • 控制台输出**
full list is
"Developers Should Celebrate Software Development Being Hard" "Lies we tell ourselves to keep using Golang"

I want to call var like this and get this output:
Developers Should Celebrate Software Development Being Hard

But instead I get this:
"Developers

我想使用for循环并行迭代列表,并使用${titles [i ]},为此,我需要输出一句话"开发人员应该庆祝软件开发变得困难",而不是一个该死的单词
也许我想把它记录到文件或其他东西,然后阅读它以正确使用它,我不知道

blmhpbnm

blmhpbnm1#

假设你的标题不能包含文字换行符(解码后的文字,JSON字符串中的\n),简单的方法是:

readarray -t titles < <(jq -r '.data.children[].data.title' <<<"$json")
echo "full list is"
printf ' - %s\n' "${titles[@]}"
echo "First title is ${titles[0]}"

readarray(也称为mapfile)是一个bash 4.0特性,它将每行输入读入一个单独的数组元素;使用jq -r使jq的输出面向行,而无需额外的JSON引用/转义。
如果它们 * 可以 * 包含换行符,就有点麻烦了:

readarray -d '' titles < <(
  jq -j '.data.children[].data.title | (., "\u0000")' <<<"$json"
)
echo "full list is"
printf ' - %s\n' "${titles[@]}"
echo "First title is ${titles[0]}"

-d ''告诉readarray期望项目以NULL结尾; -j告诉jq做原始输出,但 * 不 * 在每一项后自动添加一个换行符; (., "\u0000")手动添加这些NUL终止符(如果您要处理的数据将在数据源的权限边界的另一侧进行解释,请考虑在添加新的/额外的NUL作为分隔符之前剥离JSON中的任何NUL;大家都知道我在管道中放置了类似sub("\u0000"; "<NUL>")的东西)。
在上面的两个例子中,请注意我们是如何将每个数组元素打印在自己的行上,以证明这些元素正确地组合在一起的。

o4hqfura

o4hqfura2#

你可以让jq生成declare语句的主体:

$ unset titles
$ declare -a titles="($(jq -r '.data.children[].data.title | @sh' <<< "$json"))"

然后,您可以使用生成的Bash数组:

$ echo "${titles[0]}"
Developers Should Celebrate Software Development Being Hard

相关问题