Extrai o número da string

4

Ao usar este comando do ubuntu:

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

a saída deste comando é:

v0.1.5-2-p343h3d3

Eu quero extrair 1.5 da saída acima e verificar se é maior que 1,5 ou não.
Existe alguma solução para isso?

    
por Prakash V Holkar 27.03.2014 / 12:18

3 respostas

3

Você poderia fazer algo como

${HOME}/temp/.git describe --always --tags HEAD  | awk ' {
                             match ($0, /[0-9]+\.[0-9]+\.[0-9]+/,m)
                             if(m[0]>"0.1.5"){ 
                                 print("hello")
                              }
                             }'

Isto irá verificar o primeiro resultado de regex correspondente. Apenas dando outra maneira de fazer isso, embora eu não saiba ao certo o quanto isso é prático para você.

Felicidades

    
por rahules 27.03.2014 / 13:34
5

Os números de versão são realmente difíceis de comparar, já que muitas vezes não são comparações matemáticas padrão (esta, por exemplo, tem dois pontos decimais que fazem bc vomitar).

Portanto, recorro a uma opção menos conhecida em sort que pode ser usada para classificar strings de versão. Considere o seguinte:

$ 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

Isso basicamente significa que podemos classificar as versões para que a última seja na última linha. Tudo o que temos que fazer é uma comparação de strings contra a última linha, dentro de um if , ou um atalho-if:

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

Brinque com a string v0.1.4-2-p343h3d3 . Se você colocá-lo em 0.1.6 , ele irá ecoar.

Agora, para trazer tudo isso de volta ao seu comando:

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

Ou você pode dividi-lo para facilitar a leitura:

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
    
por Oli 27.03.2014 / 13:03
2

Você pode usar o seguinte comando para exit com um 0 status se a versão extraída for maior que 1.5

${HOME}/temp/.git describe --always --tags HEAD | perl -ne '/v\d+\.(\d+\.\d+)/;exit(1) if $1 <= 1.5'
    
por Sylvain Pineau 27.03.2014 / 12:31