Unixシェルを使用して括弧内のすべてを見つけて置き換える - 数行

Unixシェルを使用して括弧内のすべてを見つけて置き換える - 数行

シェルを使用してjsonファイルの大部分を見つけて置き換える必要があります。たとえば、次のファイルがあります。

{
  
  "Balise1": true,
  "Balise2": true,
  "OtherThingEnabled": false,
  "proxySettings": {
    "port": 0
  },
  "mailSettings": {},
  "maxRunningActivitiesPerJob": 5,
  "maxRunningActivities": 5,
}

括弧内の内容を消去する必要があります。「プロキシ設定」次に交換してください。

"proxySettings": {
    "host": "my-proxy.host.com",
    "port": 80
}

ファイルの先頭に数行があることを確認できません。一つであっても、複数であってもなくてもよい。私が確信する唯一のものは括弧だけです。正しくインデントする必要があります。

redexを使用してsed関数を調べましたが、不明な行数に遭遇しました。

助けてもらえますか?ありがとう

ベストアンサー1

JSONプロセッサのjq使用

jq '.proxySettings = { host: "my-proxy.host.com", port: 80 }' file.json

これにより、proxySettingsセクションが指定された値に設定され、以前にそのキーに関連付けられている他の値(存在する場合)が上書きされます。

コマンドラインから2つの値を渡すには(おそらくシェル変数で)、次を使用します。

myproxy=my-proxy.host.com
myport=80

jq --arg host "$myproxy" --argjson port "$myport" '.proxySettings = { host: $host, port: $port }' file.json

またはより短い

myproxy=my-proxy.host.com
myport=80

jq --arg host "$myproxy" --argjson port "$myport" '.proxySettings = $ARGS.named' file.json

最後のバリアントは、2つのキーとコマンドラインで指定された値を含む内部jqオブジェクトを生成します。このオブジェクトは入力文書のセクションに割り当てられます。$ARGS.namedhostportproxySettings

--argホスト名とポート番号を使用する理由--argjsonは、ホスト名はJSON文字列でエンコードする必要がある文字列ですが、ポート番号はJSON文字列でエンコードしないでください。

全ての場合において、結果は標準出力に記録される。新しいファイル名にリダイレクトするか、パイプを介して元のsponge file.jsonファイルを出力で上書きします。

おすすめ記事