Como exibir números apenas no final de uma variável no bash?

4

Esta não é a minha pergunta, alguém perguntou sobre isso em um grupo no Facebook, mas ninguém foi capaz de responder, então existem algumas variáveis:

x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"

Ele quer mostrar os números no final dessas variáveis, então o resultado final deve ser assim:

12345
123456

O número de dígitos varia, pode ser de 1 a 10 ou até de 1 a 100.000. e nem sempre é 12345 , é aleatório. Qual é o melhor jeito de concluir isso ? Eu tentei grep -P "[0-9].*[0-9]$" , mas também mostra letras entre números também.

    
por Titan 28.10.2016 / 12:54

2 respostas

12

No bash, você pode remover a subseqüência principal mais longa que termina com um não-dígito de uma variável $var usando substituição de parâmetro ${var##[^0-9]} ou (POSIXly) ${var##[!0-9]} p.ex.

$ echo "$x --> ${x##*[^0-9]}"
abcde12345 --> 12345
$ 
$ echo "$y --> ${y##*[^0-9]}"
s'ldfsd[opsk12345 --> 12345
$ 
$ echo "$z --> ${z##*[^0-9]}"
1234sdfsdfafa23456 --> 23456

Veja, por exemplo, Expansão de Parâmetros

    
por 28.10.2016 / 13:22
3
#!/bin/bash

x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"


echo $x | grep -o '[0-9]*$'
echo $y | grep -o '[0-9]*$'
echo $z | grep -o '[0-9]*$'

Saída:

12345
12345
23456

como homem grep

-o, --only-matching
Print only the matched (non-empty) parts of a matching line, with each such part on
a separate output line.
    
por 28.10.2016 / 13:14