hcd*_*ocs 1 json delete-operator jq
目标是删除 JSON 文件中包含 JQ 脚本中指定的键/值对的整个对象。
例如,所有带有/unwanted-path/in的对象都path将被删除:
输入.json:
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/path-2/",
"guide": "Guide 2"
},
{
"path": "/unwanted-path/",
"guide": "Guide 3"
}
]
Run Code Online (Sandbox Code Playgroud)
输出.json:
[
{
"path": "/path-1/",
"guide": "Guide 1"
},
{
"path": "/path-2/",
"guide": "Guide 2"
}
]
Run Code Online (Sandbox Code Playgroud)
这个 JQ 脚本是我所见过的最接近潜在成功方法的脚本,但当然它的意图不同并且没有实现目标。
jq '.[] | walk(if type == "object" then del(.path) else . end)' original.json > modified.json
Run Code Online (Sandbox Code Playgroud)
有没有办法在那里添加逻辑来指定要配合的键path?
关键始终是,但我会过滤path几个值。如果有一种方法可以一次path过滤多个值,那是理想的,但并不重要。path
以下代码通过四个示例展示了如何解决您的任务
#!/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"
Run Code Online (Sandbox Code Playgroud)
[
{
"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"
}
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
[
{
"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"
}
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
[
{
"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"
}
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
[
{
"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"
}
]
]
}
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
686 次 |
| 最近记录: |