bash で変数の末尾にのみ数字を表示するにはどうすればよいですか?

bash で変数の末尾にのみ数字を表示するにはどうすればよいですか?

これは実は私の質問ではありません。誰かが Facebook グループでこのことについて質問しましたが、誰も答えられなかったので、いくつか変数があります:

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

これらの変数の末尾に数字を表示したいので、最終結果は次のようになります。

12345
123456

桁数は 1 から 10 まで、または 1 から 100000 までさまざまです。常にそうであるわけではなく12345、ランダムです。これを実現する最善の方法は何ですか? 試してみましたgrep -P "[0-9].*[0-9]$"が、数字の間にも文字が表示されます。

答え1

$varbashでは、変数から数字以外の文字で終わる最長の先頭部分文字列を削除することができます。パラメータ置換 ${var##[^0-9]}または(POSIX的に)${var##[!0-9]}例えば

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

例えばパラメータ拡張

答え2

#!/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]*$'

出力:

12345
12345
23456

man grep に従って

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

関連情報