Скажем, у меня есть JSON, который содержит недостающие данные, которые можно вычислить из уже имеющихся данных с помощью регулярного выражения.
Пример данных:
[
{
"id": "a100",
"data": [
{
"something": null
}
]
},
{
"id": "a101",
"data": [
{
"something": null
}
]
},
{
"id": "b100",
"data": [
{
"something": null
}
]
}
]
Предположение: для простоты / В этом примере я использую массив как элемент верхнего уровня. Представьте себе намного больший JSON с большей вложенностью данных, находящихся в этом массиве, ie. это не может быть решено добавлением создания массива.
Скажем, нам нужно вычислить something
из id
, где something
должно быть id
с добавлением первых двух символов в конец:
[
{
"id": "a100",
"data": [
{
"something": "a100a1"
}
]
},
{
"id": "a101",
"data": [
{
"something": "a101a1"
}
]
},
{
"id": "b100",
"data": [
{
"something": "b100b1"
}
]
}
]
Я смог придумать:
jq '.[]
| . as $env
| .data[].something=($env.id | capture("(?<cid>[a-z0-9]{2})(?<rest>.*)") | .cid+.rest+.cid)' < test.json
, но это «решение» опускает все, что связано с объявленной переменной, которая в этом упрощенном примере является массивом верхнего уровня. Итак, вопрос: поскольку мы go глубже в структуре json, как сохранить некоторые значения вдоль пути узла, чтобы мы могли использовать эти переменные для обновления какой-то части структуры, сохраняя при этом остальные нетронутыми?
РЕДАКТИРОВАТЬ: приведенный выше пример был неверным, потому что его можно легко решить без использования функции capture
, о которой я спрашивал. Приведу другой пример. Проблема в том, что я не знаю, как использовать |=
для обновления части json, если capture
возвращает json-data
, где я потеряю данные, необходимые для обновления, недостаточно понимая, зачем объявлять переменную блокирует меня от использования |=
иногда et c et c. Ie. Я понятия не имею, как его использовать, несмотря на многие попытки и поиск в Google.
{
"arr": [
{
"a": {
"id": "a100",
"b": {
"c": [
{
"data": [
{
"something": null
}
]
}
]
}
}
},
{
"a": {
"id": "bPleaseUseRegex100",
"b": {
"c": [
{
"data": [
{
"something": null
}
]
}
]
}
}
}
]
}
для создания:
{
"arr": [
{
"a": {
"id": "a100",
"b": {
"c": [
{
"data": [
{
"something": "a100a"
}
]
}
]
}
}
},
{
"a": {
"id": "bPleaseUseRegex100",
"b": {
"c": [
{
"data": [
{
"something": "bPleaseUseRegex100bPleaseUseRegex"
}
]
}
]
}
}
}
]
}
о правиле регулярного выражения: все от начала id
до первого десятичное число необходимо добавить к id
, чтобы получить something
. Tbh Меня не волнует, используете ли вы вместо него .*
, просто используйте функцию capture
, чтобы увидеть, как это работает.