"jq"가 큰따옴표 대신 작은따옴표를 사용하여 json을 읽도록 하는 방법이 있습니까?

"jq"가 큰따옴표 대신 작은따옴표를 사용하여 json을 읽도록 하는 방법이 있습니까?

나는 이것을 큰 중첩 파일을 구문 분석하는 효율적인 방법 jq으로 사용합니다. 때로는 다음과 같이 키와 값을 큰따옴표 대신 작은따옴표로 묶은 형식의 파일이 필요 json합니다 .jqjson

{
  'aggs': {
    'two': {
      'composite': {
        'size': 700
       }
     }
  }
}

이것이 실제 형식으로 간주되지 않는다는 것을 알고 있지만 jsonjq에 이 파일을 읽기 위해 설정할 수 있는 매개변수가 있는지 궁금합니다. 그렇지 않으면 이 파일을 읽을 수 없습니다.

그렇지 않다면 리눅스에서 모든 작은 따옴표를 큰 따옴표로 바꾸어 읽을 수 있도록 하는 가장 효율적인 방법은 무엇입니까?jq

답변1

일반적으로 키나 문자열에 작은따옴표를 사용하는 것은 파괴적입니다.JSON 형식 사양, 그러나 우리는 문서를 리터럴(작은따옴표로 묶은) 문자열을 포함하는 YAML 문서로 해석할 수 있습니다.

마이크 파라yq이를 YAML(아래 언급된 주의사항 포함)로 구문 분석하고 표준 JSON으로 변환할 수 있습니다.

$ yq -oj eval . file
{
  "aggs": {
    "two": {
      "composite": {
        "size": 700
      }
    }
  }
}

'1"2'올바르게 변환 되지만 "1\"2"처리되지는 않습니다 '1\'2'(오류가 발생하지만 해당 문자열은 YAML에서도 유효하지 않은 문자열이므로 이는 놀라운 일이 아닙니다). 백슬래시는 작은따옴표로 묶인 YAML 문자열에서 '1\"2'리터럴 이므로 "1\\\"2".

\n백슬래시는 리터럴 백슬래시이므로 다른 인코딩된 값이 포함된 문자열(예: 로 인코딩된 리터럴 개행 또는 로 인코딩된 리터럴 탭) 에서는 원하는 작업을 수행하지 못할 수 있습니다. 평화 \t를 위해 별도로 변환하세요 .\\n\\t

안드레이 키슬류크yq(이것은 의 래퍼입니다 jq) Mike의 것과 동일한 제한 사항과 주의 사항이 있는 것 같습니다 yq.

$ yq . file
{
  "aggs": {
    "two": {
      "composite": {
        "size": 700
      }
    }
  }
}

스티븐 레빈의yj, YAML에서 JSON으로 데이터를 변환하는 데에도 사용할 수 있습니다.

$ yj <file
{"aggs":{"two":{"composite":{"size":700}}}}

답변2

이러한 파일에서 json처럼 따옴표가 이스케이프(접두사)된 경우 \문서를 제공하기 전에 따옴표를 다음으로 번역할 수 있습니다.trjq

cat file_with_single_quotes | tr "'" '"' | jq ...

아니면 더 간단합니다:

tr "'" '"' < file_with_single_quotes | jq ...

질문의 텍스트:

$ tr "'" '"' < file_sq | jq .aggs.two
{
  "composite": {
    "size": 700
  }
}

관련 정보