Редактирование на месте с помощью 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 "Ключ пользователя" '.


