私の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.11
host5
.[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"
}
]
キーまたは値文字列は解釈されません。