次の作業に助けが必要です。
JSONファイルには、次のようなセクションがあります。
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
"AWS": [文字列を探す必要があり、"arn:aws:iam::33333333333:root"という新しい行を追加する必要があります。更新されたjsonコンテンツは次のようになります。
"Principal": {
"AWS": [
"arn:aws:iam::33333333333:root",
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
sedを使用してこれを行うにはどうすればよいですか?
答え1
Principal
あなたがJSONドキュメントの最上位オブジェクトであり、シェル変数に格納されているいくつかの文字列をentry
その下(最初に)配列に追加したいとしますAWS
。
entry='arn:aws:iam::33333333333:root'
jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
この式は、jq
コマンドラインで代入を使用して、変数に含まれる文字列を配列の先頭に追加します(追加された要素から始まり、元の配列の要素が続く新しい配列で配列を更新/再作成します)。jq
$e
--arg
AWS
|=
$e
要素の追加終わり配列の変更は少し簡単になり、おそらくより効率的です(完全な配列を書き換える必要はありません)。
jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
テスト:
$ cat file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root"
]
}
}
$ entry='arn:aws:iam::33333333333:root'
$ jq --arg e "$entry" '.Principal.AWS |= [$e,.[]]' file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::33333333333:root",
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root"
]
}
}
$ jq --arg e "$entry" '.Principal.AWS += [$e]' file.json
{
"Principal": {
"AWS": [
"arn:aws:iam::12345677890:root",
"arn:aws:iam::12345677891:root",
"arn:aws:iam::33333333333:root"
]
}
}
答え2
sed
ここではツールが間違っています。JSONは一般言語ではありませんしたがって、正規表現を適用できるツールは有効なJSONをすべて解析できません。
したがって、JSONを解析して修正するために特別に設計されたツールを使用することをお勧めしjq
ます。しかし、通常、時々ユーザーにとっては、文字通り7行のPythonを書くほうがきれいです。
#!/usr/bin/env python3
# You'll want to save this to a file, e.g. mypythonscript,
# and make it executable: chmod 755 mypythonscript
import json, sys
data_in = None
with open(sys.argv[1]) as infile:
data_in = json.load(infile)
data_in["AWS"] = ["arn:aws:iam::33333333333:root"] + data_in["AWS"]
with open(sys.argv[1], "w") as outfile:
json.dump(data_in, outfile)
あなたを正当にする
./mypythonscript data.json