这其实不是我的问题,有人在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]}
或(POSIXly)${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.