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

答え2

これをお勧めしますjq(他の回答を参照)。

ただし、実際にsedを使用する必要があり、構成ファイルに開いている角かっこと閉じ括弧がない場合(表示されているように)、次のようにします(GNUを使用sed)。

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

関連情報