Вытащить версию из строки с помощью bash-скрипта - PullRequest
0 голосов
/ 09 октября 2019

Я хотел бы проверить локальную версию Hugo.

$ hugo version
Hugo Static Site Generator v0.49 linux/amd64 BuildDate: 2018-09-24T10:03:17Z

Каким будет безопасный и перспективный метод для извлечения v0.49 из вышеприведенного вывода с помощью скрипта bash?

Ответы [ 3 ]

1 голос
/ 09 октября 2019

Возможно, вам лучше использовать grep следующим образом:

$ hugo version
Hugo Static Site Generator v0.59.0-DEV/extended linux/amd64 BuildDate: unknown
$ version=v0.59
$ hugo version | grep -q "${version//./\\.}" && echo "correct version"
correct version
$ version=v0.43
$ hugo version | grep -q "${version//./\\.}" || echo "incorrect version"
incorrect version

grep -q успешно завершается, если регулярное выражение совпадает, поэтому может использоваться с условными конструкциями оболочки. Я использую расширение параметра, чтобы заменить . на \., чтобы номер версии можно было использовать в регулярном выражении (иначе . будет соответствовать любому символу).

bash docs объясняет, как работает расширение параметров (см. ${parameter/pattern/string}). По сути, ${version//./\\.} глобально (/) заменяет . на \.. Два \ требуются в строке замены, потому что первый экранирует второй.

1 голос
/ 09 октября 2019
Выражение

A sed может быть довольно общим и работать до тех пор, пока ваша версия остается в виде

v[any number of digits].[any number of digits]

Чтобы использовать sed, вы можете просто передать вывод hugo versionк вашему sed выражению, например

$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'

Пример использования / Вывод

С вашим выводом, который приведет к:

$ hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/'
v0.49

Вы можете записать результат в переменную, используя подстановка команд , например,

hversion=$(hugo version | sed 's/^.*\(v[0-9][0-9]*[.][0-9][0-9]*\).*$/\1/')

Объяснение sed Выражение

Разбивкаsed выражение - нормальная подстановка s/find/replace/, где:

  • find равно:
    • ^.* - и количество символов с начала,
    • \( - начать группу захвата, чтобы сохранить последующие данные,
    • v - символ 'v',
    • [0-9][0-9]* - минимум 1 цифра, за которой следует ноль или более цифр,
    • [.] - десятичная точка (или точка), за которой следует
    • [0-9][0-9]* - как минимум 1 цифра, за которой следуют ноль или более цифр,
    • \) - конец группы захвата с сохранением захваченного контента,
    • .*$ - все символы в конце строки.
  • replace is:
    • \1 одиночная обратная ссылка на текст из первой группы захвата.

Это его масштаб. Обычное замещение с использованием одной обратной ссылки, которая будет работать для v0.49 так же, как для v243.871.

0 голосов
/ 09 октября 2019

Я бы, вероятно, использовал встроенный в Bash read такой:

read -r _ _ _ _  hugo_version _ < <(hugo version)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...