jq의 정규식과 키 일치 [닫기]

jq의 정규식과 키 일치 [닫기]

jsonfileJSON 입력( ) 을 구문 분석하는 스크립트를 작성 중입니다 .

  {
   "key11":1010,"key11_yes":13,"key11_no":14,
   "key12":12120,"key12_yes":9,"key12_no":25,
   "key13":12103,"key13_yes":13,"key13_no":20
  }

jq tools다음과 같이 값을 사용하고 확인하고 싶습니다 .key11key12key13

cat jsonfile | jq 'key[1-9][1-9]'

이 패턴이 -style 정규식처럼 작동하길 원합니다 grep.

cat jsonfile | grep 'key[1-9][1-9]'

일치하는 키의 값이 null이면 내 스크립트는 exit 0.

key[1-9]_[this part is null]또한 if (즉, _yesor 를 추가하지 않고 _no) then 의 두 번째 매개변수를 확인해야 합니다 exit 0.

답변1

jq다음에 대한 정규식 필터 ( test, match, capture)는 원시 텍스트를 입력으로 사용합니다. 키 이름에 정규식을 적용하려면 먼저 해당 키 이름을 텍스트로 변환해야 합니다.

jq기능을 제공하다to_entries그 이유는 다음과 같습니다.

cat jsonfile | jq 'to_entries'

산출:

[
  {
    "키": "키11",
    "값": 1010
  },
  {
    "키": "key11_yes",
    "값": 13
  },
  {
    "키": "key11_no",
    "값": 14
  },
  {
    "키": "키12",
    "값": 12120
  },
...
]

그런 다음 키를 추출하고 정규식에 대해 테스트한 다음 전체 항목을 출력하거나 무시하는 필터에 입력할 수 있습니다.

if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end

일치 from_entries함수는 나머지 항목을 원래 형식으로 다시 변환하거나 with_entries이 모든 작업을 한 단계로 수행할 수 있습니다.

cat jsonfile|jq 'with_entries(if (.key|test("key[0-9][0-9]$")) then ( {key: .key, value: .value } ) else empty end )'

결과는 키가 패턴과 일치하는 입력의 모든 쌍입니다.

{
  "key11": 1010,
  "key12": 12120,
  "key13": 12103
}

관련 정보