目标是删除JSON文件中包含在JQ脚本中指定的键/值对的整个对象。
例如,将删除path中具有/unwanted-path/的所有对象:
input.json:
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/path-2/",
"guide": "Guide 2"
},
{
"path": "/unwanted-path/",
"guide": "Guide 3"
}
]output.json:
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/path-2/",
"guide": "Guide 2"
}
]就潜在的成功方法而言,这个JQ脚本是我见过的最接近的脚本,但它的意图当然是不同的,并且不能实现目标。
jq '.[] | walk(if type == "object" then del(.path) else . end)' original.json > modified.json有没有一种方法可以添加逻辑来指定与path一起使用的键
关键字始终是path,但我将根据几个path值进行过滤。如果有一种方法可以一次过滤多个path值,这是理想的,但不是关键的。
发布于 2021-07-02 04:32:49
下面的代码展示了如何通过四个示例来解决任务
#!/bin/bash
FILE='
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/unwanted-path-2/",
"guide": "Guide 2"
},
{
"path": "/path-3/",
"guide": "Guide 3",
"sub": [
{
"path": "/unwanted-path-4/",
"guide": "Guide 4"
},
{
"path": "/path-5/",
"guide": "Guide 5"
},
[
{
"path": "/path-6/",
"guide": "Guide 6"
},
{
"path": "/unwanted-path-7/",
"guide": "Guide 7"
}
]
]
}
]
'
UNWANTED='/unwanted-path-2/'
echo "example 1: keep only objects in array that does not have the unwanted path '$UNWANTED' (narrow search)"
jq --arg unwantedPath "$UNWANTED" \
'map(select(.path != $unwantedPath))' <<< "$FILE"
UNWANTED='/unwanted-path-7/'
echo -e "\nexample 2: delete objects that have the unwanted path '$UNWANTED' exactly (deep search)"
jq --arg unwantedPath "$UNWANTED" \
'del(..| objects | select(.path == $unwantedPath)) ' <<< "$FILE"
UNWANTED='unwanted'
echo -e "\nexample 3: delete objects that have the unwanted path '$UNWANTED' partially (deep search)"
jq --arg unwantedPath "$UNWANTED" \
'del(..| objects | select(.path | index($unwantedPath) != null)) ' <<< "$FILE"
UNWANTED='["/unwanted-path-4/", "/unwanted-path-7/"]'
echo -e "\nexample 4: delete objects that have one of unwanted paths '$UNWANTED' (deep search)"
jq --argjson unwantedPath "$UNWANTED" \
'del(..| objects | select(.path | IN($unwantedPath[]))) ' <<< "$FILE"输出示例1:只保留数组中没有不需要的路径‘/ unwanted path -2/’的对象(缩小搜索范围)
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/path-3/",
"guide": "Guide 3",
"sub": [
{
"path": "/unwanted-path-4/",
"guide": "Guide 4"
},
{
"path": "/path-5/",
"guide": "Guide 5"
},
[
{
"path": "/path-6/",
"guide": "Guide 6"
},
{
"path": "/unwanted-path-7/",
"guide": "Guide 7"
}
]
]
}
]输出示例2:删除具有不需要的路径‘/ unwanted path -7/’的对象(深度搜索)
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/unwanted-path-2/",
"guide": "Guide 2"
},
{
"path": "/path-3/",
"guide": "Guide 3",
"sub": [
{
"path": "/unwanted-path-4/",
"guide": "Guide 4"
},
{
"path": "/path-5/",
"guide": "Guide 5"
},
[
{
"path": "/path-6/",
"guide": "Guide 6"
}
]
]
}
]输出示例3:删除部分不想要的路径' unwanted‘的对象(深度搜索)
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/path-3/",
"guide": "Guide 3",
"sub": [
{
"path": "/path-5/",
"guide": "Guide 5"
},
[
{
"path": "/path-6/",
"guide": "Guide 6"
}
]
]
}
]输出示例4:删除具有不需要的路径‘“/ unwanted path-4/”,“/unwanted path-7/”’的对象(深度搜索)
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/unwanted-path-2/",
"guide": "Guide 2"
},
{
"path": "/path-3/",
"guide": "Guide 3",
"sub": [
{
"path": "/path-5/",
"guide": "Guide 5"
},
[
{
"path": "/path-6/",
"guide": "Guide 6"
}
]
]
}
]https://stackoverflow.com/questions/68214943
复制相似问题