- 此问题在此处已有答案**:
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 ]},为此,我需要输出一句话"开发人员应该庆祝软件开发变得困难",而不是一个该死的单词
也许我想把它记录到文件或其他东西,然后阅读它以正确使用它,我不知道
2条答案
按热度按时间blmhpbnm1#
假设你的标题不能包含文字换行符(解码后的文字,JSON字符串中的
\n
),简单的方法是:readarray
(也称为mapfile
)是一个bash 4.0特性,它将每行输入读入一个单独的数组元素;使用jq -r
使jq的输出面向行,而无需额外的JSON引用/转义。如果它们 * 可以 * 包含换行符,就有点麻烦了:
-d ''
告诉readarray期望项目以NULL结尾;-j
告诉jq做原始输出,但 * 不 * 在每一项后自动添加一个换行符;(., "\u0000")
手动添加这些NUL终止符(如果您要处理的数据将在数据源的权限边界的另一侧进行解释,请考虑在添加新的/额外的NUL作为分隔符之前剥离JSON中的任何NUL;大家都知道我在管道中放置了类似sub("\u0000"; "<NUL>")
的东西)。在上面的两个例子中,请注意我们是如何将每个数组元素打印在自己的行上,以证明这些元素正确地组合在一起的。
o4hqfura2#
你可以让jq生成
declare
语句的主体:然后,您可以使用生成的Bash数组: