JQ применяет функцию, чтобы диктовать, но печатать окружающие данные - PullRequest
1 голос
/ 30 марта 2019

Я бы хотел

"1": {
        "id": "1",
        "type": "select",
        "label": "country :",
        "choices": {
          "1": {
            "label": "Canada CAN",
            "value": "",
          },
          "2": {
            "label": "United States USA",
            "value": ""
          }
        }
}

для производства

"1": {
        "id": "1",
        "type": "select",
        "label": "country :",
        "choices": {
          "1": {
            "label": "Canada",
            "value": "CAN",
          },
          "2": {
            "label": "United States",
            "value": "USA"
          }
        }
}

К настоящему времени у меня есть двухэтапное решение, состоящее из sed-подобной функции

def do_extract:
if .value | test("^$") then
    (.value = (.label | capture(".* (?<code>...)")).code) | .label = (.label | capture("(?<name>.*) ...$").name)
else
    .
end;

и прямой доступ к поддереву []."1"."choices"|keys_unsorted as $key|map_values(do_extract), но я должен вручную скопировать и вставить вывод вместо оригинального «выбора».

Есть ли способ выполнить функцию, но все же распечатать окружающие данные?

Спасибо

1 Ответ

1 голос
/ 30 марта 2019

Ну, чтобы получить желаемый результат, вы можете сделать это:

.[].choices[] |= (.label | capture("^(?<label>.*?) (?<value>[^ ]+)$"))

Чтобы сделать это в вашей функции, я бы изменил это на:

def do_extract:
  if .value == "" then
    (.label | capture("^(?<label>.*?) (?<value>[^ ]+)$"))
  else
    .
  end;

Тогда используйте это:

.[].choices[] |= do_extract
...