【问题标题】:How to add a new element to a JSON file from a shell script [duplicate]如何从 shell 脚本向 JSON 文件添加新元素 [重复]
【发布时间】:2015-11-05 04:35:16
【问题描述】:

我有下面的 JSON 文件 test.json

{
            "run_list": ["recipe[cookbook-ics-op::setup_server]"],
            "props": {
                "install_home": "/inst1",
                             "tmp_dir": "/inst1/tmp",
                "user": "rven"
                }
}

从一个 shell 脚本中,我必须在 props 下再添加 2 个属性。我不想先阅读现有内容然后再添加。谁能帮助我如何做到这一点?

【问题讨论】:

  • 如果您不阅读现有内容,那么您怎么知道可以添加到哪里?

标签: json linux shell unix


【解决方案1】:

试试 sed:

sed -e 's/"props": {/"props": { "foo": "bar", "spam": "eggs",/' test.json

结果:

{
        "run_list": ["recipe[cookbook-ics-op::setup_server]"],
        "props": { "foo": "bar", "spam": "eggs",
            "install_home": "/inst1",
                         "tmp_dir": "/inst1/tmp",
            "user": "rven"
            }
}

【讨论】:

  • 这仅适用于格式非常具体的情况。如果props 开头是空的,在这种情况下,结尾的逗号会破坏语法怎么办?如果在: 之后有一个换行符而不是一个空格怎么办?如果其中一个键已经存在怎么办?
  • 另外,如果文件中的其他位置有另一个名为 props 的键,它会做错事。
  • @CharlesDuffy:你没有错,但 OP 要求提供与 this 文件一起使用的东西,而不是防弹解决方案。让他判断够不够。
  • 当然,但是如果 OP 只需要 完全 这个文件的东西,他们可以手动构建一个输出文件并让他们的脚本复制它。 :)
  • 再说一次,你可能是对的,但我更愿意从 OP 的嘴里听到这个。
【解决方案2】:

使用可识别 JSON 的工具,例如 jq。要添加两个属性,foobar

jq '.props.foo="hello" | .props.bar="bye"' <in.json >out.json

如果你想对值使用 shell 变量:

foo=hello; bar=bye
jq --arg foo="$foo" \
   --arg bar="$bar" \
   '.props.foo=$foo | .props.bar=$bar' \
   <in.json >out.json

如果您希望能够同时使用 shell 变量指定键和值:

key=hello; val=world
jq --arg key="$key" \
   --arg val="$val" \
  '.props[$key]=$val' \
  <in.json >out.json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-25
    • 2010-10-04
    • 2012-12-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多