我需要帮助来完成以下任务。
在 JSON 文件中,我有一个类似于下面的部分
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
我需要在其中找到一个字符串 "AWS": [ 并且它应该添加一个带有 "arn:aws:iam::33333333333:root" 的新行,因此更新后的 json 内容应该如下所示。
"Principal": {
"AWS": [
"arn:aws:iam::33333333333:root",
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
如何使用 sed 执行此操作?
答案1
假设Principal
是 JSON 文档中的顶级对象,并且您想要将一些保存在 shell 变量 中的字符串添加entry
到其下方的数组(开头)中AWS
:
entry='arn:aws:iam::33333333333:root'
jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
该表达式将保存在变量jq
中的字符串添加到数组的开头,使用在命令行上分配(它使用新数组更新/重写数组,从添加的元素开始,后跟数组的元素原始数组)。jq
$e
--arg
AWS
|=
$e
将元素添加到结尾数组的修改会稍微容易一些,并且可能更高效(因为不需要重写整个数组),
jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
测试:
$ cat file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root"
]
}
}
$ entry='arn:aws:iam::33333333333:root'
$ jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::33333333333:root",
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root"
]
}
}
$ jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
"arn:aws:iam::33333333333:root"
]
}
}
答案2
sed
这里的工具是错误的 –JSON 不是常规语言因此,可以应用正则表达式的工具将无法解析所有有效的 JSON。
因此,使用专门用于解析和修改 JSON 的工具 –jq
很好,但通常,对于偶尔使用的用户来说,编写(字面上的)7 行 python 会更清晰。
#!/usr/bin/env python3
# You'll want to save this to a file, e.g. mypythonscript,
# and make it executable: chmod 755 mypythonscript
import json, sys
data_in = None
with open(sys.argv[1]) as infile:
data_in = json.load(infile)
data_in["AWS"] = ["arn:aws:iam::33333333333:root"] + data_in["AWS"]
with open(sys.argv[1], "w") as outfile:
json.dump(data_in, outfile)
会让你只是
./mypythonscript data.json