Bash 스크립트에서 jq를 사용하여 특정 값 패턴을 가진 요소 가져오기

Bash 스크립트에서 jq를 사용하여 특정 값 패턴을 가진 요소 가져오기

설치를 시도하기 전에 프로젝트의 애플리케이션 이름을 가져오는 것을 목표로 쉘 스크립트에서 홈브류 API를 호출하고 있습니다. 다행히 API는 이를 이라는 요소에서 제공합니다 artifacts. 안타깝게도 artifacts하나의 요소만 선택할 수 있는 키가 더 이상 없습니다. 순서에 관계없이 객체와 배열을 혼합할 수 있습니다.

Google Chrome의 샘플 데이터 스니펫:

{
   "name":[
      "Google Chrome"
   ],
   "artifacts":[
      [
         "Google Chrome.app"
      ]
   ]
}

그러나 도커는 또 다른 이야기입니다.

{
   "name":[
      "Docker"
   ],
   "artifacts":[
       {
         "trash":[
           "$(brew --prefix)/bin/docker-compose.backup",
           "$(brew --prefix)/bin/docker.backup"
         ]
      },
      [
         "docker.app"
      ]
   ]
}

artifacts따라서 이와 같은 쉘 스크립트에서 요소 0을 가져올 수 없습니다 .

artifacts=$(curl -s "https://formulae.brew.sh/api/cask/google-chrome.json" | jq -r '.artifacts[0][0]')

artifactsjq를 사용하여 *.app으로 끝나는 패턴 값에 대한 요소를 검색하는 방법이 있나요 ? 내가 생각해 낼 수 있는 가장 좋은 의사 코드는 이것이지만 $element를 참조하려고 할 때 약간의 혼란을 겪습니다.

# $cask is determined by a list the script loops through ('google-chrome' is one example)
for element in $(curl -s "https://formulae.brew.sh/api/cask/$cask.json" | jq -r '.artifacts'); do
    # if $element is an array and it's value ends with "*.app"
        # assign to a variable for later use
done

여기 하나 있어요jqplay 조각반환된 더 복잡한 JSON 중 하나입니다. 고유 값 "docker.app"을 포함하는 배열의 일부가 표시됩니다. 이것이 내가 달성하고 싶은 것입니다.

답변1

jq쿼리는 Docker의 JSON에서 작동합니다.

.artifacts[] | arrays[0] | select(endswith(".app"))

필터는 arrays요소에서 배열을 선택한 artifacts다음 이 배열의 첫 번째 요소를 조회하여 로 끝나는 요소를 찾을 수 있습니다 .app.

답변2

유사한 검색어무루가 그랬듯이artifacts하지만 배열의 항목이 문자열로 끝나면 배열의 모든 아티팩트를 반환합니다 .app.

.artifacts[] | select(type == "array" and any(endswith(".app")))[]

또는,

.artifacts[] | arrays | select(any(endswith(".app")))[]

따라서 애플리케이션에 일부 아티팩트가 있는 경우thething.app 그리고 someotherthing.quux동일한 배열에 넣은 다음 둘 다 반환합니다.

관련 정보