【问题标题】:Append new element to JSON object in specific format using bash and jq使用 bash 和 jq 以特定格式将新元素附加到 JSON 对象
【发布时间】:2020-01-13 13:34:41
【问题描述】:

我想将一个元素附加到现有的 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 直接管理?

【问题讨论】:

  • 如果Readme是工作目录,你知道../RandomFile.json是要修改的文件名,还是只是父目录下有一个JSON文件要修改?

标签: json bash jq


【解决方案1】:

这需要jq 1.6 才能使用--args 选项。

$ 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. shell 用于将当前工作目录的基本名称作为变量$wd 传递。
  2. shell 还用于将当前工作目录中所有文件的名称作为单独的参数传递。
  3. 假定要编辑的文件为../RandomFile.json;如果只知道父级中有一个 JSON 文件,可以使用../*.json 代替。
  4. 使用+= 使用新键(工作目录)和文件名列表更新原始的.docs 对象。 map$ARGS.positional 的每个元素加上$wd 前缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多