Добавить новый элемент к объекту JSON в указанном формате c, используя bash и jq - PullRequest
0 голосов
/ 13 января 2020

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

Позволяет сказать У меня есть следующая структура:

 Docs (Directory)
 |
 +-- RandomFile.json
 |    
 +-- Readme (Working Directory)
 |  |  
 |  +-- Readme.md
 |  +-- Readyou.md

То, что я хотел бы достичь, это структура ниже с рабочим каталогом в качестве префикса для каждого элемента в массиве.

"Readme": ["Readme/Readme.md", "Readme/Readyou.md"]

Из выше, я хотел бы добавить это к содержимому RandomFile. json, который в настоящее время выглядит так:

{
  "docs": {
    "Doc": ["doc1"]
  }
}

к этому:

{
  "docs": {
    "Doc": ["doc1"],
    "Readme": ["Readme/Readme.md", "Readme/Readyou.md"]
  }
}

Это что-то, с чем можно просто справиться, используя bash и jq?

1 Ответ

1 голос
/ 13 января 2020

Для использования опции --args требуется jq 1.6.

$ jq --arg wd "$(basename "$PWD")" '.docs+={($wd): $ARGS.positional | map("\($wd)/\(.)")}' ../RandomFile.json --args *
{
  "docs": {
    "Doc": [
      "doc1"
    ],
    "Readme": [
      "Readme/Readme.md",
      "Readme/Readyou.md"
    ]
  }
}
  1. Оболочка используется для передачи базового имени текущего рабочего каталога в качестве переменной $wd.
  2. Оболочка также используется для передачи имен всех файлов в текущем рабочем каталоге в качестве отдельных аргументов.
  3. Предполагается, что файл для редактирования будет ../RandomFile.json; если вы знаете, что в родительском файле есть a JSON, вместо него можно использовать ../*.json.
  4. Используйте += для обновления .docs объекта оригинала с новым ключом (рабочий каталог) и списком имен файлов. map префикс каждого элемента $ARGS.positional с $wd.
...