BusyBox 도구를 사용하여 JSON 구문 분석

BusyBox 도구를 사용하여 JSON 구문 분석

소프트웨어 레지스트리에서 검색된 json blob의 정보를 수집하여 일부 소프트웨어의 최신 버전을 결정하는 POSIX 호환 설치 스크립트가 있습니다.

meta=$(wget -qO - https://registry.npmjs.org/after-dark/latest)
grep --version | grep "BSD grep" 1>/dev/null && vers=$(echo "$meta" | grep -oE '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')
grep --version | grep "GNU grep" 1>/dev/null && vers=$(echo "$meta" | grep -oP '"version":(\d*?,|.*?[^\\]",)' | tr -d 'version": ,')

-E이 소프트웨어를 BSD grep처럼 확장된 정규식 지원에 사용하는 BusyBox와 호환되도록 만들어야 합니다 . 그러나 플래그는 지원하지 않습니다 --version.

실행하면 busybox grepbusybox 버전이 표시됩니다. 호환성을 추가하기 위해 이를 사용해야 합니까? 종속성을 설치하지 않고 코드 냄새를 제거하기 위해 이 작업을 수행할 수 있는 더 좋은 방법이 있습니까?

답변1

더 이상 기다릴 수 없어서 이에 대해 새로운 시각을 갖고 GNU, BSD 및 BusyBox grep을 사용하여 잘 테스트하고 semver에 대한 지원을 향상시키는 다음 솔루션을 생각해냈습니다.

egrep -o "\"version\".*[^,]*," <<< "$meta" | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" '

ERE grep을 호출하여 작동합니다.정규식(와 함께모자 팁)를 사용하여 cut후행 쉼표를 잘라내고 오른쪽에 있는 모든 항목을 잡고 :문자열을 자르고 존재하는 큰따옴표를 제거합니다.

$meta가 주어지면 {"version":"5.5.0-beta4",}정확히 가 반환됩니다 5.5.0-beta4. 가
주어지면 정확히 가 반환됩니다 .$meta"version" : 1,1

version필드는 가독성을 고려한 JSON blob의 마지막 필드가 아니라고 가정 합니다.

원래 질문에 적용하면 다음과 같은 결과가 나옵니다.

vers=$(echo "$meta" | egrep -o "\"version\".*[^,]*," | cut -d ',' -f1 | cut -d ':' -f2 | tr -d '" ')

grep 버전을 감지할 필요성을 제거하고 코드 냄새를 제거합니다.

업데이트:

나는 결국 어떤 곳으로 인도되었다.더 우아한 솔루션sed에서 사용후속 질문그래서.

관련 정보