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" ]},
]

},\n]私の考えは、content.jsonファイルで正規表現を見つけて、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使用すると、2つの配列を必要な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最上位項目をマージします。配列は、2つの別々の配列項目を持つ各ファイルのデータで構成される配列です。

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

おすすめ記事