值是列表时匹配
Matching When Value Is List
我有一个与此类似的 API 转储文件。
{
"abc": {
"Code": "ABC",
"Type": [] },
"def": {
"Code": "DEF",
"Type": [
"A"
]
},
"ghi": {
"Code": "GHI",
"Type": [
"B"
]
},
"jkl": {
"Code": "JKL",
"Type": [
"A",
"B"
]
},
"mno": {
"Code": "MNO",
"Type": [ "Universal" ]
}
}</pre>
我正在尝试提取对象,并根据某些类型匹配获取代码键。
例如。
尝试在 Type 匹配“A”、“B”、“A、B”或 Universal 的地方,我得到的对象包含两者,或在某些情况下不包含任何内容。
这是我试过的。
jq -r '.[] | select(.Type[] == "A") | .Code' /tmp/test.json</pre>
我明白了
DEF
JKL
意外匹配类型 ["A"} 和类型 ["A", "B"]
jq -r '.[] | select(.Type[] == "B") | .Code' /tmp/test.json</pre>
我明白了。
GHI
JKL
意外匹配类型 ["B"} 和类型 ["A", "B"]
jq -r '.[] | select(.Type[] == "A, B") | .Code' /tmp/test.json</pre>
什么都不匹配。
这按预期工作。
jq -r '.[] | select(.Type[] == "Universal") | .Code' /tmp/test.json</pre>
MNO
jq程序
.[] | select(any(.Type[]; IN("A","B","A, B","通用"))) | .代码
产生:
"DEF"
"GHI"
"JKL"
"MNO"
如果您想要完全匹配,请将以下内容保存到 script.jq
中:
.[] | select(.Type == $match) | .Code
然后用
测试
$ jq -r --argjson match '["A"]' -f script.jq test.json
DEF
$ jq -r --argjson match '["B"]' -f script.jq test.json
GHI
$ jq -r --argjson match '["A", "B"]' -f script.jq test.json
JKL
我有一个与此类似的 API 转储文件。
{ "abc": { "Code": "ABC", "Type": [] }, "def": { "Code": "DEF", "Type": [ "A" ] }, "ghi": { "Code": "GHI", "Type": [ "B" ] }, "jkl": { "Code": "JKL", "Type": [ "A", "B" ] }, "mno": { "Code": "MNO", "Type": [ "Universal" ] } }</pre>
我正在尝试提取对象,并根据某些类型匹配获取代码键。
例如。 尝试在 Type 匹配“A”、“B”、“A、B”或 Universal 的地方,我得到的对象包含两者,或在某些情况下不包含任何内容。
这是我试过的。
jq -r '.[] | select(.Type[] == "A") | .Code' /tmp/test.json</pre>
我明白了
DEF意外匹配类型 ["A"} 和类型 ["A", "B"]
JKLjq -r '.[] | select(.Type[] == "B") | .Code' /tmp/test.json</pre>
我明白了。GHI意外匹配类型 ["B"} 和类型 ["A", "B"]
JKLjq -r '.[] | select(.Type[] == "A, B") | .Code' /tmp/test.json</pre>
什么都不匹配。这按预期工作。
jq -r '.[] | select(.Type[] == "Universal") | .Code' /tmp/test.json</pre>
MNO
jq程序
.[] | select(any(.Type[]; IN("A","B","A, B","通用"))) | .代码
产生:
"DEF"
"GHI"
"JKL"
"MNO"
如果您想要完全匹配,请将以下内容保存到 script.jq
中:
.[] | select(.Type == $match) | .Code
然后用
测试$ jq -r --argjson match '["A"]' -f script.jq test.json
DEF
$ jq -r --argjson match '["B"]' -f script.jq test.json
GHI
$ jq -r --argjson match '["A", "B"]' -f script.jq test.json
JKL