Como extrair um número de versão usando sed?

1

Estou tentando encontrar a melhor expressão regular para extrair um número de versão de uma string. Por exemplo:

 echo "Version 1.2.4.1 (release mode)" | sed -ne 's/.*\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*//p'

O problema aqui é que ele funciona apenas se o número da versão estiver no formato "a.b.c.d". Se alguém decidir adicionar ou remover um dígito ("a.b.c.d.e", "a.b.c"), ele será quebrado. Então eu gostaria de fatorizar o regex e dizer ao sed que eu quero:

(1 ou mais números seguidos de um ponto) x 1 ou mais vezes, seguido de um número.

Não consigo encontrar como "agrupar" o "1 ou mais números seguidos de um ponto", por isso posso dizer que quero esse padrão pelo menos uma vez. Eu tentei isso, mas não funciona:

\([0-9]\+\.\)\+

Alguma idéia?

    
por liberforce 02.12.2011 / 14:17

2 respostas

3

Tente o próximo comando 'sed':

$ echo "Version 1.2.4.1 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*//p'
1.2.4.1

Ele usa a sintaxe {i, j}, que seleciona a expressão várias vezes entre o primeiro e o último número. Não deveria haver nenhum número na string antes do número da versão.

Mais exemplos:

$ echo "Version 1.2.4.1.6 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*//p'
1.2.4.1.6 
$ echo "Version 1.2 (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*//p'
1.2 
$ echo "Version 1.2. (release mode)" | sed -ne 's/[^0-9]*\(\([0-9]\.\)\{0,4\}[0-9][^.]\).*//p'
$ 

EDITAR para comentários :

$ echo "Version 1.2.4.1.90 (release mode)" | sed -nre 's/^[^0-9]*(([0-9]+\.)*[0-9]+).*//p'
    
por 02.12.2011 / 14:42
3

Tente isto:

[0-9]+(\.[0-9]+)*

Significa "corresponde a 1 ou mais dígitos e, em seguida, corresponde a qualquer número de (pontos + dígitos)".

    
por 02.12.2011 / 14:43

Tags