複数行を含むファイルで、次の文字列を別の文字列に置き換えようとします。
"schema" : "AAAAA",
到着
"schema" : "BBBBB",
現在、「スキーマ」を使用してその行を取得するために次のコマンドを実行しています。
現在のアーキテクチャ=cat test.json | grep schema | awk {'print $3'}
すると「AAAAAA」という値が表示されます。
AAAAAをBBBBBに変えたい
次のコマンドを使用しました。
sed -e 's/$currentSchema/BBBBB/p' test.json
ただし、同じファイル内では交換できません。
ベストアンサー1
JSONファイルの例:
[
{
"host": "myhost",
"schema": "AAAAA",
"lunch": "sandwich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
私たちはそれぞれを次のように変えたいと思いますschema
。AAAAA
BBBBB
jq
$ jq 'map(if .schema == "AAAAA" then .schema = "BBBBB" else . end)' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
次の場合、古いスキーマが何であるかは問題ではありません。
$ jq 'map(.schema = "BBBBB")' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "BBBBB",
"lunch": "pizza"
}
]
これは適切なJSONパーサーなので、jq
ファイルがよりコンパクトな形式(たとえば1行)でレンダリングされている場合にも機能します。
[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]
~のため実際質問(コメントから)、つまり値を含むキーを持つ要素を見つけ、その要素.rules.behavior[]
を.name
別の値にmPulse
変更します。.options.apiKey
jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json
つまり、キーを持つ要素が新しい要素を取得する.rules.behaviour
ように配列を再構築します。.name
mPulse
.options.apiKey