В следующем коде показано, как решить вашу задачу на четырех примерах
#!/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: частичное удаление объектов с нежелательным путем (глубокий поиск)
[
{
"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"
}
]
]
}
]
Ожидается ли, что вы также будете иметь
path
во вложенной области? или только внутри массива верхнего уровня?@Inian, твой вопрос для меня сложный, но, если я правильно понимаю, он не будет вложенным.