sed コマンドの代替書き込み

sed コマンドの代替書き込み

複数行を含むファイルで、次の文字列を別の文字列に置き換えようとします。

"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"
  }
]

私たちはそれぞれを次のように変えたいと思いますschemaAAAAABBBBBjq

$ 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ように配列を再構築します。.namemPulse.options.apiKey

おすすめ記事