Извлечение числа из строки

При использовании этой команды ubuntu:

${HOME}/temp/.git describe --always --tags HEAD 

вывод этой команды:

v0.1.5-2-p343h3d3

Я хочу извлечь 1.5 из выведенного выше и проверить, если это больше 1,5 или нет. Есть ли какое-либо решение для этого ??

1
задан 16 March 2015 в 12:59

2 ответа

Номера версий на самом деле довольно сложно сравнивать, учитывая, что они часто не являются стандартными математическими сравнениями (например, у этого есть две десятичные точки, которые заставляют bc забрасывать).

Поэтому я перехожу к менее известный вариант в sort, который можно использовать для сортировки строк версии. Рассмотрим следующее:

$ echo -e "v0.1.5\nv0.1.6-2-p343h3d3" | sort -V
v0.1.5
v0.1.6-2-p343h3d3

oli@bert:~$ echo -e "v0.1.5\nv0.1.4-2-p343h3d3" | sort -V
v0.1.4-2-p343h3d3
v0.1.5

В основном это означает, что мы можем сортировать версии так, чтобы последние находились на последней строке. Все, что нам нужно сделать, это сравнение строк с последней строкой внутри if или shortcutted-if:

[[ $(echo -e "v0.1.5\nv0.1.4-2-p343h3d3" | sort -V | tail -1) != "v0.1.5" ]] && echo NEWER

Воспроизведение со строкой v0.1.4-2-p343h3d3. Если вы вставите его на 0.1.6, он выйдет из себя.

Теперь, чтобы вернуть все это к вашей команде:

[[ $(echo -e "v0.1.5\n$(${HOME}/temp/.git describe --always --tags HEAD)" | sort -V | tail -1) != "v0.1.5" ]] && echo NEWER

Или вы можете сломать его читаемость:

THRESHOLD="v0.1.5"
VERSION=$(${HOME}/temp/.git describe --always --tags HEAD)
if [[ $(echo -e "$THRESHOLD\n$VERSION" | sort -V | tail -1) != "$THRESHOLD"  ]]; then
    echo GREATER
fi
5
ответ дан 24 May 2018 в 10:21

Вы можете использовать следующую команду для exit с статусом 0, если извлеченная версия больше 1,5

${HOME}/temp/.git describe --always --tags HEAD | perl -ne '/v\d+\.(\d+\.\d+)/;exit(1) if $1 <= 1.5'
2
ответ дан 24 May 2018 в 10:21
  • 1
    Обновлен в соответствии с вашим новым шаблоном версии – Sylvain Pineau 27 March 2014 в 17:38

Другие вопросы по тегам:

Похожие вопросы: