Редактирование на месте с помощью find и jq дает противоречивые результаты
Я пытаюсь использовать jq для изменения довольно большого количества файлов если файл содержит свойство с определенным значением:
find . \ -имя '*.configuration.json' \ -type f -exec bash -c 'jq "select(.version == \"2.0\") | .identifier = \"\"" $0 | губка "$0"' {} \;
Итак, я узнал, как добраться сюда, например, как на самом деле перенаправить вывод в -exec
и как вместо для перенаправления вывода с использованием jq
.
Приведенный выше скрипт работает для некоторых найденных файлов, но для других файлов он просто перезаписывает весь файл вообще без всего. Я предполагаю, что это вызвано состоянием гонки, но я не знаю, как я могу это исправить.
Будем очень признательны за любую помощь или указание на другие ловушки, с которыми я мог столкнуться.
- найти
- jq
0
Проблема с вашим выражением
заключается в том, что если ключ версии
для объекта JSON не равен 2. 0
, то этот объект не выбран и не будет выведен. Это означает, что вы фактически удаляете все, что не имеет 2.0
как версии
.
Вместо этого обновите значение идентификатора
для каждого объекта, у которого версия
равна 2.0
:
jq 'select(.version == "2.0").identifier = ""'
Суть в том, чтобы обновить значение, не извлекая его из объекта.
Можно также использовать что-то вроде следующего, что больше похоже на то, что у вас есть в коде:
jq 'select(.version == "2.0") |= (.identifier = "")'
Здесь используется оператор обновления |=
для обновления объектов, выбранных с помощью select()
.
С найти
:
найти . -name '*.configuration.json' -type f -exec sh -c ' tmpfile=$(mktemp) для пути сделать cp -- "$pathname" "$tmpfile" && jq "select(.version == \"2.0\").identifier = \"\"" <"$tmpfile" >"$pathname" сделанный rm -f "$tmpfile"' sh {} +
Это также позволяет избежать вызова встроенного сценария больше, чем необходимо, а цикл в сценарии sh -c
гарантирует, что разрешения и права собственности на исходный файл будут сохранены.
Или, если вы хотите использовать губку
(которую я никогда не использовал сам, так что считайте это непроверенным примером):
find . -name '*.configuration.json' -type f -exec sh -c ' для пути сделать jq "select(.version == \"2.0\").identifier = \"\"" "$pathname" | губка "$pathname" готово {} +
1
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания, политикой конфиденциальности и политикой использования файлов cookie
curl — jq найти значение, соответствующее значению из другого ключа
Задавать вопрос
спросил
Изменено 1 год, 10 месяцев назад
Просмотрено 3к раз
У меня есть вывод curl | джк:
{ "ssh_keys": [ { "id": 30482248, "отпечаток пальца": "21:57:08:d8:41:0f:89:57:0b:96:95:64:ff:59:50:69", "public_key": "ssh-rsa AAAA вячеслав@MacBook.local", "name": "Ключ пользователя" }, { "идентификатор": 30450573, "отпечаток пальца": "27:0c:2e:34:63:00:13:9d:5c:26:44:15:f0:cf:15:13", "public_key": "ssh-rsa AAAA-VirtualBox", "имя": "тест1" }, { "id": 30485316, "отпечаток пальца": "28:63:11:6b:a0:c7:ae:e1:e7:98:0b:01:96:c2:f4:87", "public_key": "уроки ssh-rsa AAAA", "имя": "rbm-mykey" } ], "ссылки": { "страницы": { "последний": "https://api.digitalocean.com/v2/account/keys?page=3", "далее": "https://api.digitalocean.com/v2/account/keys?page=2" } }, "мета": { "всего": 59} }
Я хочу вернуть «public_key», который имеет значение с «User’s key» из ключа «name», поэтому результат должен быть
"ssh-rsa AAAA [email protected]"
Я попробовал команду:
curl -X GET -H "Авторизация: носитель" "https://api.digitalocean.com/v2/account/keys?page=1" | jq '.[] | .[] | .имя'
Но получены только значения ключа «name»
- curl
- json
- jq
0
Использование jq
для выбора записи public_key
для элемента массива ssh_keys
с именем
, равным ключу пользователя
(где строка ключ пользователя
импортируется в jq
переменная $queryname
в командной строке):
jq -r --arg queryname "Ключ пользователя" '.