次のコンテンツファイルがあります。
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