如何从shell脚本向JSON文件添加新元素
我有下面的JSON文件test.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"
{
"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的口中听到这些。