Парсинг JSON с утилиты busybox

у меня есть сценарий установки, совместимый с POSIX, который определяет последнюю версию некоторого программного обеспечения, удаляя информацию из blob-объекта json, полученного из реестра программного обеспечения:

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": ,')

мне нужно сделать это программное обеспечение совместимым с BusyBox, который, как и BSD grep, использует -E расширенная поддержка regex. Однако он не поддерживает --version флаг.

если я запускаю busybox grep Я вижу версию busybox. Должен ли я просто использовать это, чтобы добавить совместимость? Есть ли лучший способ я это может быть сделано для удаления запаха кода без установки зависимостей.

5
задан Josh Habdas
источник

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 на вопрос так.

0
отвечен Josh Habdas 2018-08-24 09:48:13
источник

Другие вопросы bash busybox grep json parsing