これは実は私の質問ではありません。誰かが Facebook グループでこのことについて質問しましたが、誰も答えられなかったので、いくつか変数があります:
x="abcde12345"
y="s'ldfsd[opsk12345"
z="1234sdfsdfafa23456"
これらの変数の末尾に数字を表示したいので、最終結果は次のようになります。
12345
123456
桁数は 1 から 10 まで、または 1 から 100000 までさまざまです。常にそうであるわけではなく12345
、ランダムです。これを実現する最善の方法は何ですか? 試してみましたgrep -P "[0-9].*[0-9]$"
が、数字の間にも文字が表示されます。
答え1
$var
bashでは、変数から数字以外の文字で終わる最長の先頭部分文字列を削除することができます。パラメータ置換 ${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.