在 JSON 文件中的字符串匹配后添加新行

在 JSON 文件中的字符串匹配后添加新行

我需要帮助来完成以下任务。

在 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--argAWS|=$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

相关内容