Como obter números usando expressão regular, mas apenas um último

1

Neste exemplo, posso obter 00 .

expr match "00 foo 99.jpg" '[^0-9]*\([0-9]\+\).*$'

Eu quero saber como obter o último número da string, neste caso 99 usando expressão regular.

A string pode conter apenas um conjunto de números como "foo00.jpg", ou vários deles como "00 foo 11 bar 22 foo.jpg".

Como posso escrever a expressão regular?

    
por ironsand 24.01.2014 / 06:22

3 respostas

1
file="00 foo 99.jpg"
expr "x$file" : '.*[^0-9]\([0-9]\{1,\}\)'

Não use echo para dados arbitrários, você não pode usar sed como sed funciona em linhas e nomes de arquivos podem ser feitos de várias linhas.

match não é um operador padrão de expr , : é o equivalente padrão, portanto você também pode usá-lo para evitar problemas de portabilidade.

Prefixar $file com x garante que $file não seja considerado como um operador expr . (e neste caso ajuda nos casos em que os números não são precedidos por não-números).

Observe que o acima tem um efeito colateral indesejado que retorna um status de saída diferente de zero se o número retornado for 0 (ou 00 , 000 ...).

\+ não é um operador regexp básico padrão. \{1,\} é o equivalente padrão (embora você também possa escrevê-lo em [0-9][0-9]* ).

Você não precisa usar expr aqui, você também pode usar a expansão de parâmetro shell (qualquer shell POSIX):

file="00 foo 99.jpg"
number=x${file}x
number=${number%[!0-9]*}
number=${number##*[!0-9]}
    
por 24.01.2014 / 11:09
1

Usando a sintaxe de regex estendida do GNU sed (% BSD sed s tem -E em vez de -r ):

$ echo  "00 foo 99.jpg" | sed -r  's/(^|.*[^0-9])([0-9]+)[^0-9]*$//' 
99

Usando o GNU expr match em vez de sed :

$ expr match "$(echo "01 foo 89.jpg" | rev)" '[^0-9]*\([0-9]\+\)' | rev
89
    
por 24.01.2014 / 07:37
1

Com o GNU grep :

$ echo "00 foo 99.jpg" | grep -o '[[:digit:]]\+' | tail -n1
99
    
por 24.01.2014 / 12:31