JSONを解析するためにsedの使用をサポートする必要があります

JSONを解析するためにsedの使用をサポートする必要があります

ホームアシスタントでは、コマンドを実行してスイッチの状態を設定できます。残念ながら、1つのスイッチではなく、すべてのスイッチの状態を取得する方法を提供する古いホームオートメーションを移行しています。 HAフォーラムでは、sedを使用してjson出力を解析することが提案されていますが、動作させるのに十分ではありません。

次の結果が表示されます。

{"status": "ok", "version": "3.381", "request": {"route": "/get-status"}, "response": {"preset": 0, "time": " 2018-03-08 09:45","スイッチ":[{"id":0,"タイプ":"スイッチ","状態":"去る"},{"id":1,"type":"switch","status":"off"},{"id":2,"type":"switch","status":"off"} ,{"id":3,"type":"dimmer","status":"off","dimlevel":0},{"id":4,"type":"switch","status ": "off"},{"id":5,"type":"dimmer","status":"on","dimlevel":2},{"id":6,"type": "dimmer", "status": "off", "dimlevel": 0}, {"id": 7, "type": "スイッチ", "status": "off"}, {"id": 8. "タイプ": "switch", "status": "off"}, {"id":9, "type": "switch", "status": "off"}, {"id":10, "type":"switch ","status":"off"},{"id":11,"type":"switch","status":"on"},{"id":16,"type ":"switch", "status":"off"},{"id":17,"type":"switch","status":"off"},{"id":18,"type": "virtual"},{ "id":19,"type":"virtual"},{"id":20,"type":"switch","status":"on"},{"id": 21,"type": "スイッチ","状態":"オフ"},{"id":22,"タイプ":"スイッチ","状態":"オフ"},{"id":23, "タイプ":"スイッチ" ","status":"on"},{"id":24,"type":"switch","status":"off"},{"id":25,"type ":"virtual"} ],"uvmeters":[],"windmeters":[],"rainmeters":[{"id":2,"mm":0.7,"3h":0.7,"favorite": "no"}], "温度計":[{"id":0,"te":19.1,"hu":49,"favorite":"no"},{"id":1,"te ":18.5,"hu": 48,"favorite":"no"}],"weatherdisplays":[],"energymeters": [],"energylinks": [{"id":0,"tariff": 2,"s1":{" po":497,"dayTotal":1.53,"po+":1379,"po+t":"09:11","po-":0,"po-t": "00:01"}," s2":{"po":0,"dayTotal":50.00,"po+":9,"po+t":"07:13","po-":0," po-t":"00: 01"},"集計":{"po":-314,"毎日の合計":1.03,"po+":1363,"po+t":"07:26"," po-":-1105," po -t":"08:39"},"使用済み":{"po":183,"dayTotal":2.53,"po+":1463,"po+t": "07:26","po- ":39,"po-t":"08:57"},"gas":{"lastHour":0.01,"dayTotal":1.50}, "kwhindex":0.00} ], "heatlinks": [], "kakusensors": [{ "id": 0, "status": null, "timestamp": "00:00"}, {"id": 1 , "status": "いいえ", "timestamp": "09:21"}, {"id": 2, "status": null, "timestamp": "00:00"},{"id":3 ,"status":"いいえ","timestamp":"09:20"},{"id":4,"status":null,"timestamp":"19: 31"},{"id":5 ,"status":null,"timestamp":"00:00"},{"id":6,"status":null,"timestamp":"00:00" },{"id":7," status":null,"timestamp":"00:00"},{"id":8,"status":null,"timestamp" :"00:00"}, {"id":9,"status" :null,"timestamp":"00:00"},{"id":10,"status":null,"timestamp" :"00:00"},{" id":11,"status":null ,"timestamp":"00:00"},{"id":12,"status":null,"timestamp":" 18:51"}]}}

太字で表示されていることが必要です。 jsonはresult.switches.id [0].statusと同じことをし、sedを使って同じことをしたいと思います。最初の部分(スイッチまで)を切り取りましたが、試すたびに次の結果が表示されます。{"id":0.*"status":(".*")}.*最初に会う}の代わりに最後の}と一致するので、すべてを取得します。

どんな提案がありますか?

ベストアンサー1

提案:を使用しないでくださいsed。代わりに、次のようなものを使用してくださいjq

$ jq -r '.response.switches[] | select(.id == 0).status' file.json
off

または最初の配列要素を選択switchesし、実際の要素は気にしない場合id

$ jq -r '.response.switches[0].status' file.json
off

sed行中心のテキストを解析するのに適しています。 JSONには改行で区切られたレコードは含まれず、sed引用規則、エンコードエンティティなどを認識しません。これらの構造化データセット(またはXML、YAML、場合によってはCSV)を正しく解析するには、正しいパーサーを使用する必要があります。

この例では、追加ボーナスでjq次のコードを取得できます。簡単に必要に応じて変更し、入力データ構造への変更をサポートするように簡単に変更することもできます。

おすすめ記事