홈어시스턴트에서는 명령을 실행하여 스위치 상태를 설정할 수 있습니다. 불행히도 하나의 스위치가 아니라 모든 스위치에 대해 상태를 가져오는 방법을 제공하는 오래된 홈 자동화를 마이그레이션하고 있습니다. 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
다음과 같은 코드를 얻을 수 있습니다.용이하게필요에 맞게 수정하고 입력 데이터 구조에 대한 변경을 지원하도록 쉽게 수정할 수도 있습니다.