Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从shell脚本向JSON文件添加新元素_Json_Linux_Shell_Unix - Fatal编程技术网

如何从shell脚本向JSON文件添加新元素

如何从shell脚本向JSON文件添加新元素,json,linux,shell,unix,Json,Linux,Shell,Unix,我有下面的JSON文件test.JSON { "run_list": ["recipe[cookbook-ics-op::setup_server]"], "props": { "install_home": "/inst1", "tmp_dir": "/inst1/tmp", "user": "rven"

我有下面的JSON文件test.JSON

{
            "run_list": ["recipe[cookbook-ics-op::setup_server]"],
            "props": {
                "install_home": "/inst1",
                             "tmp_dir": "/inst1/tmp",
                "user": "rven"
                }
}
从一个shell脚本中,我必须在props下再添加两个属性。我不想先阅读现有内容,然后再添加到其中。有人能帮我做这件事吗?

试试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"
            }
}
试试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"
            }
}

使用JSON感知工具,例如。要添加两个属性,
foo
bar

jq '.props.foo="hello" | .props.bar="bye"' <in.json >out.json
jq.props.foo=“你好”|.props.bar=“再见”out.json
如果要对值使用shell变量,请执行以下操作:

foo=hello; bar=bye
jq --arg foo="$foo" \
   --arg bar="$bar" \
   '.props.foo=$foo | .props.bar=$bar' \
   <in.json >out.json
foo=hello;再见
jq--arg foo=“$foo”\
--arg bar=“$bar”\
“.props.foo=$foo |.props.bar=$bar”\
out.json
如果希望能够使用shell变量指定键和值:

key=hello; val=world
jq --arg key="$key" \
   --arg val="$val" \
  '.props[$key]=$val' \
  <in.json >out.json
key=hello;瓦尔=世界
jq--arg key=“$key”\
--arg val=“$val”\
“.props[$key]=$val”\
out.json

使用JSON感知工具,例如。要添加两个属性,
foo
bar

jq '.props.foo="hello" | .props.bar="bye"' <in.json >out.json
jq.props.foo=“你好”|.props.bar=“再见”out.json
如果要对值使用shell变量,请执行以下操作:

foo=hello; bar=bye
jq --arg foo="$foo" \
   --arg bar="$bar" \
   '.props.foo=$foo | .props.bar=$bar' \
   <in.json >out.json
foo=hello;再见
jq--arg foo=“$foo”\
--arg bar=“$bar”\
“.props.foo=$foo |.props.bar=$bar”\
out.json
如果希望能够使用shell变量指定键和值:

key=hello; val=world
jq --arg key="$key" \
   --arg val="$val" \
  '.props[$key]=$val' \
  <in.json >out.json
key=hello;瓦尔=世界
jq--arg key=“$key”\
--arg val=“$val”\
“.props[$key]=$val”\
out.json

如果你不阅读现有内容,那么你如何知道可以添加到哪里?如果你不阅读现有内容,那么你如何知道可以添加到哪里?只有在格式非常具体的情况下,这才有效。如果
props
开始为空,在这种情况下,后面的逗号将破坏语法,该怎么办?如果紧跟在
后面的是换行符而不是空格,该怎么办?如果其中一个密钥已经存在怎么办?另外,如果文件中的其他地方有另一个名为
props
的密钥,它会做错误的事情。@CharlesDuffy:你没有错,但是OP要求的是与此文件一起使用的东西,而不是防弹解决方案。让他来判断这是否足够。当然,但如果OP只需要与此文件完全兼容的东西,他们可以手工构建输出文件,并让脚本将其复制过来。:)再说一次,你可能是对的,但我会从OP的口中听到这句话。这只有在格式非常具体的情况下才有效。如果
props
开始为空,在这种情况下,后面的逗号将破坏语法,该怎么办?如果紧跟在
后面的是换行符而不是空格,该怎么办?如果其中一个密钥已经存在怎么办?另外,如果文件中的其他地方有另一个名为
props
的密钥,它会做错误的事情。@CharlesDuffy:你没有错,但是OP要求的是与此文件一起使用的东西,而不是防弹解决方案。让他来判断这是否足够。当然,但如果OP只需要与此文件完全兼容的东西,他们可以手工构建输出文件,并让脚本将其复制过来。:)再说一次,你可能是对的,但我会从OP的口中听到这些。