使用 sed 在文件中查找匹配项并将其替换为其他文件的内容

使用 sed 在文件中查找匹配项并将其替换为其他文件的内容

我有一个类似这样的内容文件:

content.json(对象数组)

[
{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]},
]

有一个配置文件,其内容相似但值不同。

config.json(对象值)

{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]},

我的目标是将 config.json 文件的内容附加到 content.json 文件,以便新的 content.json 文件将变为:

[
{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]},
{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]},
]

我的想法是从 content.json 文件中找到},\n]正则表达式并将其替换为 config.json 文件的内容。由于我远程运行这些命令,我​​的想法是使用 sed 将其作为单个命令运行。但不知何故,我没有在 sed 中获得任何适当的文档/帮助来实现这一目标。

任何人都可以在这里帮忙吗?

答案1

假设这些文件是有效的 JSON 文件,即该content.json文件看起来像

[
{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]}
]

或者喜欢

{ "interval": 1, "expired": 3, "ignored": [ ".git", ".p4" ]}
{ "interval": 2, "expired": 4, "ignored": [ ".git", ".p4" ]}

看起来config.json

[
{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]},
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]}
]

或者喜欢

{ "interval": 3, "expired": 3, "ignored": [ ".git", ".p4" ]}
{ "interval": 4, "expired": 4, "ignored": [ ".git", ".p4" ]}

...然后jq可用于轻松地将两个数组合并到您需要的 JSON 结构中:

$ jq -s flatten content.json config.json
[
  {
    "interval": 1,
    "expired": 3,
    "ignored": [
      ".git",
      ".p4"
    ]
  },
  {
    "interval": 2,
    "expired": 4,
    "ignored": [
      ".git",
      ".p4"
    ]
  },
  {
    "interval": 3,
    "expired": 3,
    "ignored": [
      ".git",
      ".p4"
    ]
  },
  {
    "interval": 4,
    "expired": 4,
    "ignored": [
      ".git",
      ".p4"
    ]
  }
]

flatten中的命令合并jq数组的顶级条目。该数组是由每个文件中的数据组成的数组,作为两个单独的数组条目。

用于jq -c获得更紧凑的输出:

$ jq -cs flatten content.json config.json
[{"interval":1,"expired":3,"ignored":[".git",".p4"]},{"interval":2,"expired":4,"ignored":[".git",".p4"]},{"interval":3,"expired":3,"ignored":[".git",".p4"]},{"interval":4,"expired":4,"ignored":[".git",".p4"]}]

答案2

我建议你这样做jq(参见其他答案)。

但是,如果您确实必须使用 sed,并且配置文件没有开始和结束方括号(如图所示),则(使用 GNU sed):

sed -i -e '$rconfig.json' -e '$a]' -e '$d' content.json

相关内容