JSON을 구문 분석하기 위해 sed 사용을 지원해야 함

JSON을 구문 분석하기 위해 sed 사용을 지원해야 함

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

관련 정보