bashスクリプトとjqを使用してこのJSONファイルを編集する方法

bashスクリプトとjqを使用してこのJSONファイルを編集する方法

私のconfig.jsonファイルには、次の内容が含まれています。

[{
  "host0": "11.11.11.11",
  "host1": "22.22.22.22",
  "host2": "33.33.33.33",
  "host3": "44.44.44.44",
  "host4": "55.55.55.55",
  "host5": "66.66.66.66"
}]

コマンドラインから起動できる.sh bashスクリプトを作成し、config.jsonファイルを編集して、ホスト0行全体とその値を完全に削除しようとしています。その後、残りの値を「上に移動」する必要があります。つまり、ホスト1をホスト0に、ホスト2をホスト1に、ホスト3をホスト2に、ホスト4をホスト3に変更するなどの名前を意味しますが、その値は同じにする必要があります。最終結果は次のようになります。

[{
  "host0": "22.22.22.22",
  "host1": "33.33.33.33",
  "host2": "44.44.44.44",
  "host3": "55.55.55.55",
  "host4": "66.66.66.66"
}]

bashスクリプトとjq、またはコマンドラインまたはcronから起動できる他のbashスクリプトを使用してこれを行うにはどうすればよいですか? .shスクリプトにハードコードされています。jq '.host0="22.22.22.22" config.jsonオプションではありません。 config.jsonを読み込み、ホスト1の値をコピーしてホスト0などに貼り付けるスクリプトが必要です。

ベストアンサー1

次のjq式は、最上位配列の各要素に変換を適用します(質問の配列には1つの要素しかありません)。変換には、最後に追加されたキー+値の値を最後に追加された要素の値に置き換えることによって、指定されたキーと値から新しい配列を構築することが含まれます。これにより、最初の値が質問から捨てなければならない値であり、最後のキーが質問から捨てなければならないキーである長さの配列n+1(ここでn元の配列要素のキーと値の数)が生成されます。質問。 (と書くこともできます)を使用すると、最初と最後の要素を破棄し、キーと値のリストを残します。11.11.11.11host5.[1:-1]del(first,last)n-1

jq 'map(to_entries | reduce .[] as $a ([{}]; last.value = $a.value | . += [$a]) | .[1:-1] | from_entries)' file

以下は、jqより読みやすい形式の式です。

map(
  to_entries |
  reduce .[] as $a (
    [{}];
    last.value = $a.value |
    . += [$a]
  ) |
  del(first, last) |
  from_entries
)

次のJSONドキュメントをfile見ると

[
  {
    "host0": "11.11.11.11",
    "host1": "22.22.22.22",
    "host2": "33.33.33.33",
    "host3": "44.44.44.44",
    "host4": "55.55.55.55",
    "host5": "66.66.66.66"
  },
  {
    "server0": "Atlantis",
    "server1": "Gotham",
    "server2": "Rivendell",
    "server3": "Asgard",
    "server4": "Hogwarts",
    "server5": "Neverland"
  }
]

... このjqコマンドは、次の結果を生成します。

[
  {
    "host0": "22.22.22.22",
    "host1": "33.33.33.33",
    "host2": "44.44.44.44",
    "host3": "55.55.55.55",
    "host4": "66.66.66.66"
  },
  {
    "server0": "Gotham",
    "server1": "Rivendell",
    "server2": "Asgard",
    "server3": "Hogwarts",
    "server4": "Neverland"
  }
]

キーまたは値文字列は解釈されません。

おすすめ記事