여러 줄을 "sed"로 바꾸고 JSON으로 변환하는 방법은 무엇입니까?

여러 줄을 "sed"로 바꾸고 JSON으로 변환하는 방법은 무엇입니까?
{
  "auth": 'log',
  "appid": 21,
  "custid": "599c1f910f53ada8468b4567",
  "hwid": "59e719ba0f53adfd6a8b4597"
}

24/10/2017 12:44:24
--------------------------------------------------------------------------------
{
  "auth": 'log',
  "appid": 21,
  "custid": "599c1f910f53ada8468b4567",
  "hwid": "59e719ba0f53adfd6a8b4597"
}

파일의 일부 로그 줄로 구분된 json 목록을 단일 json으로 변환해야 합니다. 지금까지 나는 이것을 시도했습니다 :

tac tst.txt | sed '/---------/I,+2 d' | tac > out.json

로그 줄을 삭제했는데 쉼표로 바꾸고 목록에 추가해야 합니다. 어떻게 해야 하나요? 아니면 Python을 사용하는 대안이 있습니까?

답변1

sed+jq해결책:

sed -E "/^(---|[0-9][0-9])/d; s/'([^']+)'/\"\1\"/" tst.txt | jq -s '' out.json
  • /^(---|[0-9][0-9])/d---- 또는 2자리로 시작하는 불필요한 줄을 제거합니다.

  • s/'([^']+)'/\"\1\"/"- 작은따옴표로 묶인 값을 유효한 JSON 값으로 바꿉니다(큰따옴표로 묶음).

  • jq -s ''- 입력의 모든 JSON 객체에 대해 필터를 실행하는 대신 전체 입력 스트림을 하나의 큰 배열로 읽습니다.


콘텐츠 out.json:

[
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  },
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  }
]

답변2

주변 따옴표가 log큰 따옴표로 수정되었다고 가정하면 다음을 사용하십시오 sed.

sed -e '1s/^/[/' \
    -e '$s/$/]/' \
    -e 's/^-.*$/,/' \
    -e '/^[0-9]/d' file | jq .

표현 sed:

  1. [입력의 첫 번째 줄 시작 부분에 a를 삽입합니다.
  2. ]입력의 마지막 줄 끝에 하나를 삽입하십시오.
  3. -단일 쉼표로 시작하는 모든 줄을 바꿉니다.
  4. 임의의 숫자로 시작하는 줄을 삭제합니다.

호출은 jq선택 사항입니다(형식만 정리합니다).

산출:

[
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  },
  {
    "auth": "log",
    "appid": 21,
    "custid": "599c1f910f53ada8468b4567",
    "hwid": "59e719ba0f53adfd6a8b4597"
  }
]

jq -s또는 를 사용하는 짧은 대안 jq --slurp:

sed -e '/^[-0-9]/d' file | jq -s

관련 정보