-1

У меня есть 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 для расширенной поддержки регулярных выражений. Однако он не поддерживает флаг --version .

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

1 ответ1

0

Не могу больше ждать, поэтому я добавил несколько свежих идей и нашел следующее решение, которое хорошо зарекомендовало себя с использованием 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 не является последним полем в BLOB-объекте JSON, который является компромиссом для удобочитаемости.

Применительно к исходному вопросу результат:

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

Устранение необходимости обнаружения версии grep и удаление запаха кода.

ОБНОВИТЬ:

В конечном итоге меня привели к более элегантному решению с использованием sed в последующем вопросе о SO.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .