![jq를 사용하여 허용 목록/차단 목록을 기반으로 선택하는 방법](https://linux55.com/image/195205/jq%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%97%88%EC%9A%A9%20%EB%AA%A9%EB%A1%9D%2F%EC%B0%A8%EB%8B%A8%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%EC%84%A0%ED%83%9D%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
를 사용하여 jq
일부 허용 목록/차단 목록에 있는 각 요소 키의 포함/제외를 기반으로 배열에서 json 요소를 어떻게 선택할 수 있습니까?
대소문자를 구분하지 않는 포함을 만들고 싶습니다(따라서 허용 목록/차단 목록 대소문자는 중요하지 않습니다).
제가 시도한 방법은 다음과 같습니다(차단 목록은 구현되지 않음).
allowlist='["happy", "good"]'
blocklist='["sad", "bad"]'
jq --argjson allowlist "$allowlist" \
--argjson blocklist "$blocklist" \
'.[]
| select(.my_key | ascii_downcase
| contains($allowlist[]))' \
<<< '[{"my_key": "neutral"}, {"my_key": "neutral good"},
{"my_key": "neutral bad"}, {"my_key": "good"},
{"my_key": "bad"}, {"my_key": "happy sad bad"},
{"my_key": "neutral happy sad"}]'
예상 출력:
{"my_key": "neutral good"}
{"my_key": "good"}
답변1
select
, any
및 를 사용하면 all
필터가 다음과 같이 요약됩니다.
jq --argjson allowlist "$allowlist" \
--argjson blocklist "$blocklist" '.[] |
select( any ( .my_key ; contains( $allowlist[] ) ) ) |
select( all ( .my_key ; contains( $blocklist[] ) | not ) )'
모두 소문자가 필요한 경우 ascii_downcase
위 필터에 값을 추가하세요.my_key
contains