Редактирование на месте с помощью find и jq дает противоречивые результаты

Я пытаюсь использовать jq для изменения довольно большого количества файлов если файл содержит свойство с определенным значением:

 find . \
    -имя '*.configuration.json' \
    -type f -exec bash -c 'jq "select(.version == \"2.0\") | .identifier = \"\"" $0 | губка "$0"' {} \;
 

Итак, я узнал, как добраться сюда, например, как на самом деле перенаправить вывод в -exec и как вместо для перенаправления вывода с использованием jq .

Приведенный выше скрипт работает для некоторых найденных файлов, но для других файлов он просто перезаписывает весь файл вообще без всего. Я предполагаю, что это вызвано состоянием гонки, но я не знаю, как я могу это исправить.

Будем очень признательны за любую помощь или указание на другие ловушки, с которыми я мог столкнуться.

  • найти
  • jq

0

Проблема с вашим выражением

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