我只想要with
下面的示例文件。
这仅供参考,无法在此处粘贴公司代码,因为它在安全环境中运行,因此不允许,但我的问题有些相似。我必须从值中获取特定的字符串。请帮忙
{
"id": "0001",
"type": "donut",
"name": "Cake",
"ppu": 0.55,
"batters":
{
"batter":
[
{ "id": "1001", "type": "Regular" },
{ "id": "1002", "type": "Chocolate" },
{ "id": "1003", "type": "Blueberry" },
{ "id": "1004", "type": "Devil's Food" }
]
},
"topping":
[
{ "id": "5001", "type": "None" },
{ "id": "5002", "type": "Glazed" },
{ "id": "5005", "type": "Sugar" },
{ "id": "5007", "type": "Powdered Sugar" },
{ "id": "5006", "type": "**Chocolate with Sprinkles**" },
{ "id": "5003", "type": "Chocolate" },
{ "id": "5004", "type": "Maple" }
]
}
答案1
jq -r '.topping[] | select(.id == "5006").type / " " | .[1]' file.json
这会选择数组中与 string 相等的topping
数组元素,并从中提取键的值。然后,它将该值拆分为空格并提取第二个生成的单词。它被输出、解码到标准输出。id
5006
type
如果/ " "
看起来很有趣,您可以将该部分替换为| split(" ")
,它的作用更明确。或者| scan("\\S+")
提取非空白字符序列,以防字符串中存在前导空格或尾随空格,或者除空格之外的其他空白字符或单词之间存在多个空白字符。
如果您不确定在哪里在您的文档中,该字符串是,但它是具有且等于该字符串type
的对象的值,那么您可以使用id
5006
jq -r '.. | select(.id? == "5006").type / " " | .[1]' file.json
这会迭代所有值和键(因此效率非常低)并选择具有id
value 的键的任何内容5006
。然后它就像上面最上面的变体一样进行。
with
给定问题中的数据,任一表达式都会在标准输出上生成单词。
答案2
您没有提供您知道的信息,例如键的名称等,但如果您也允许使用 cut,这是我的最佳猜测:
cat testjq.json | jq -r '.topping[] | select(.id == "5006" )' | grep type | cut -d "\"" -f 4 | cut -d " " -f 2