Ce n'est pas vraiment ma question, quelqu'un a demandé à ce sujet dans un groupe facebook, mais personne n'a pu y répondre, donc il y a des variables:
x="abcde12345" y="s'ldfsd[opsk12345" z="1234sdfsdfafa23456"
Il veut montrer les numbers à la fin de ces variables, de sorte que le résultat final devrait être comme ceci:
12345 123456
Le nombre de numbers varie, il peut être de 1 à 10 ou même de 1 à 100 000. et ce n'est pas toujours 12345
, c'est random. Quelle est la meilleure façon d'y parvenir ? J'ai essayé grep -P "[0-9].*[0-9]$"
mais il montre aussi des lettres entre les nombres aussi.
Dans bash, vous pouvez supprimer la plus longue sous-string se terminant par un non-chiffre à partir d'une variable $var
utilisant la substitution ${var##[^0-9]}
ou (POSIXly) ${var##[!0-9]}
par exemple
$ echo "$x --> ${x##*[^0-9]}" abcde12345 --> 12345 $ $ echo "$y --> ${y##*[^0-9]}" s'ldfsd[opsk12345 --> 12345 $ $ echo "$z --> ${z##*[^0-9]}" 1234sdfsdfafa23456 --> 23456
Voir par exemple Expansion de paramètre
#!/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]*$'
Sortie:
12345 12345 23456
selon l'homme grep
-o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line.