对一个 JSON 模板进行多项更改

Jor*_*tle 1 bash templates json jq

我目前正在使用jq1pass CLI 尝试将随机生成的密码创建到安全笔记中。我在设置字段时遇到问题。

这是我的两个变量。我总共需要设置 8 个。

section0_section_uuid="Section_0"

section1_section_uuid="Section_1"
Run Code Online (Sandbox Code Playgroud)

这是我操作模板的命令。我首先阅读它,更改第一个标题,然后将其保存到$template. 然后我通过$templatejq

template=$(cat template.json | jq --arg uuid "$section0_section_uuid" '.sections[0].title=$uuid')

template=$($template | jq --arg uuid "$section1_section_uuid" '.sections[1].title=$uuid')

echo $template
Run Code Online (Sandbox Code Playgroud)

我收到“文件名太长”。我认为我没有正确传递修改后的模板变量。我需要对template.json文件再做 7 次修改。

编辑:

这是我试图操纵的完整模板。我必须对模板进行 12 次更改。12 个中的 10 个是我将生成的随机数。12 个中的其余 2 个将是生成的用户名。

{
  "fields": [],
  "sections": [
    {
      "fields": [
        {
          "k": "concealed",
          "n": "[CHANGE_ME]",
          "t": "ROOT_USER_PASS",
          "v": "[CHANGE_ME]"
        },
        {
          "k": "concealed",
          "n": "[CHANGE_ME]",
          "t": "DEV_USER_PASS",
          "v": "[CHANGE_ME]"
        }
      ],
      "name": "Section_[CHANGE_ME]",
      "title": "Container SSH"
    },
    {
      "fields": [
        {
          "k": "string",
          "n": "[CHANGE_ME]",
          "t": "placeholdertext",
          "v": "[CHANGE_ME_LETTERS]"
        },
        {
          "k": "string",
          "n": "[CHANGE_ME]",
          "t": "placeholdertext",
          "v": "[CHANGE_ME_LETTERS]"
        },
        {
          "k": "concealed",
          "n": "[CHANGE_ME]",
          "t": "placeholdertext",
          "v": "[CHANGE_ME]"
        }
      ],
      "name": "Section_[CHANGE_ME]",
      "title": "MySQL"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

che*_*ner 9

为什么不让你的模板成为一个真正的jq过滤器,而不是一个 JSON blob 来修改呢?

的内容template.jq

{
  sections: [
    { title: $t1 },
    { title: $t2 },
    { title: $t3 },
    { title: $t4 },
    { title: $t5 },
    { title: $t6 },
    { title: $t7 },
    { title: $t8 }
  ]
}
Run Code Online (Sandbox Code Playgroud)

那么你的命令就是

$ jq -n --arg t1 foo --arg t2 bar ... -f template.jq
{
  "sections": [
    {
      "title": "foo"
    },
    {
      "title": "bar"
    },
    ...
  ]
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处之一是您不会意外忘记一个值;jq如果您为所有 8 个变量提供定义,则只能处理过滤器。