Bash 스크립트로 구문 분석하는 방법은 무엇입니까? (플랫폼 MIPS)? [복사]

Bash 스크립트로 구문 분석하는 방법은 무엇입니까? (플랫폼 MIPS)? [복사]
$ curl -LNs "http://urladrescom/content.json" > content.json

콘텐츠.json

{
   "k":[
      {
         "i":1,
         "n":"NAME 1",
         "p":[
            {
               "b":"Event 1",
               "c":"00:00",
               "d":"03:00"
            },
            {
               "b":"Event 2",
               "c":"23:00",
               "d":"00:00"
            }
         ]
      },
      {
         "i":2,
         "n":"NAME 2",
         "p":[
            {
               "b":"Event 1",
               "c":"07:15",
               "d":"09:15"
            },
            {
               "b":"Event 2",
               "c":"22:00",
               "d":"23:15"
            },
            {
               "b":"Event 3",
               "c":"23:15",
               "d":"02:30"
            }
         ]
      },
      {
         "i":3,
         "n":"NAME 3",
         "p":[
            {
               "b":"Event 1",
               "c":"07:15",
               "d":"09:15"
            },
            {
               "b":"Event 2",
               "c":"22:00",
               "d":"23:15"
            },
            {
               "b":"Event 3",
               "c":"23:15",
               "d":"02:30"
            }
         ]
      }
   ]
}

grepawkBash 스크립트( , , sed등)(또는 Bash 스크립트 cmd의 Python)를 사용하여 이벤트 1, 2, 3에서 "NAME 2"의 내용을 가져오고 싶습니다 .

결과를 인쇄하고 싶습니다.

NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

답변1

이 Python을 사용하여 원하는 작업을 수행할 수 있습니다.

$ cat parse.py
#!/bin/python

import json
#from pprint import pprint

with open('content.json') as f:
  data = json.load(f)

for dict in data["k"]:
  if (dict["n"] == "NAME 2"):
    for elem in dict["p"]:
      print(dict["n"] + ' \\ ' + elem["b"] + ' \\ ' + elem["c"] + ' \\ ' + elem["d"])

$ ./parse.py
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

답변2

명령줄 JSON 파서 사용jq...

이 작업을 수행하는 더 짧은 표현이 있을 수 있지만 jq이것이 제가 생각해낸 것입니다.

$ jq -r --arg name "NAME 2" '.[][]|select(.n==$name).p[]|[$name,.[]]|join(" \\ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

또는 보다 선택적인 코드를 사용하여Steeldriver 권장 사항을 기반으로 함,

$ jq -r --arg name "NAME 2" '.k[]|select(.n==$name).p[]|[$name, .b, .c, .d]|join(" \\ ")' content.json
NAME 2 \ Event 1 \ 07:15 \ 09:15
NAME 2 \ Event 2 \ 22:00 \ 23:15
NAME 2 \ Event 3 \ 23:15 \ 02:30

namejq명령줄에서 값이 전달되는 변수 입니다 . 이 jq코드는 다섯 가지 작업을 수행합니다.

  1. k데이터에서 관심 있는 배열을 추출합니다 .
  2. 출력하려는 ​​특정 배열(및 그 안의 비트)을 선택합니다 p.
  3. 출력용 배열을 만듭니다(이름은 데이터의 일부가 아니므로 삽입해야 함).
  4. 출력을 수행할 때 특정 구분 기호를 삽입합니다.

관련 정보