如何使用bash操作jq输出?
我有以下jq代码片段: 我想使用bash循环结果数组中的每个元素,如伪代码所示:如何使用bash操作jq输出?,bash,jq,Bash,Jq,我有以下jq代码片段: 我想使用bash循环结果数组中的每个元素,如伪代码所示: #!/bin/bash foreach result print "My name is {name}, I'm {age} years old" print "--" 结果将是: My name is A, I'm 1 years old. --- My name is B, I'm 2 years old. --- My name is C, I'm 3 years old. --- 当然,这是一
#!/bin/bash
foreach result
print "My name is {name}, I'm {age} years old"
print "--"
结果将是:
My name is A, I'm 1 years old.
---
My name is B, I'm 2 years old.
---
My name is C, I'm 3 years old.
---
当然,这是一个简单的例子,只是为了说明我的目标是分别操作jq结果中的每个数组
关于如何将伪代码写入有效的bash语句,有什么建议吗?保存json:
{
"Names": [
{ "Name": "A", "Age": "1" },
{ "Name": "B", "Age": "2" },
{ "Name": "C", "Age": "3" }
]
}
作为/tmp/input.txt,我可以运行:
</tmp/input.txt jq --raw-output 'foreach .Names[] as $name ([];[];$name | .Name, .Age )' \
| while read -r name && read -r age; do
printf "My name is %s, I'm %d years old.\n" "$name" "$age";
printf -- "--\n";
done
很遗憾,最好是编写一个完整的解析器,将像“\”
这样的字符串考虑在内
</tmp/input2.txt sed 's/^\[//;s/\]$//;' \
| while IFS=, read name age; do
name=${name%\"};
name=${name#\"};
age=${age%\"};
age=${age#\"};
printf "My name is %s, I'm %d years old.\n" "$name" "$age";
printf -- "--\n";
done
我编写了一个简单的脚本来实现您所需要的:
我的Json文件test.Json
与您的代码片段类似:
{
"Names": [
{ "Name": "A", "Age": "1" },
{ "Name": "B", "Age": "2" },
{ "Name": "C", "Age": "3" }
]
}
我的剧本:
#!/bin/bash
for i in $(cat test.json | jq -r '.Names[] | @base64'); do
_jq() {
echo ${i} | base64 --decode | jq -r ${1}
}
echo "My Name is $(_jq '.Name'), I'm $(_jq '.Age') years old"
done
请注意,foreach.Names[]作为$name([];[];$name |.name.Age)
可简化为:
.Names[] | ( .Name, .Age )
甚至在这种特殊情况下:
.Names[][]
或就此而言:
.[][][]
然而,重要的一点是,foreach
不需要实现简单的迭代。我将您的答案标记为有效答案,因为您使用了与我在代码段中使用的相同的筛选器。非常感谢您的详细解释!您好,我没有将其标记为已接受的答案,因为所使用的筛选器与我在中使用的筛选器不同我的第一个问题,但我很高兴知道我能达到同样的结果。非常感谢!
.[][][]