我有一个像这样的字符串rev00000010
,我只想要最后一个数字,在本例中为 10。
我已经尝试过这个:
TEST='rev00000010'
echo "$TEST" | sed '/^[[:alpha:]][0]*/d'
echo "$TEST" | sed '/^rev[0]*/d'
两者都没有返回任何内容,尽管正则表达式似乎是正确的(尝试过正则表达式)
答案1
您传递的命令的sed
含义是:如果某行与正则表达式匹配,则将其删除。那不是你想要的。
echo "$TEST" | sed 's/rev0*//'
这意味着:在每一行中,删除 rev 后跟任意数量的零。
而且,你不需要sed
这么简单的事情。只需使用 bash 及其参数扩展:
shopt -s extglob # Turn on extended globbing.
echo "${TEST##rev*(0)}" # Remove everything from the beginning up to `rev`
# followed by the maximal number of zeroes.
答案2
POSIXly:
test='rev00000010'
number=${test#"${test%%[1-9]*}"}
将删除最左侧非零数字左侧的所有内容。
伯恩利/普遍:
number=`expr "x$test" : 'xrev0*\(.*\)'`
答案3
如果您已经有了变量 TEST,只需打印它并删除所有字母
printf "%.0f\n" ${TEST//[a-z]/}
或者
printf "%g\n" ${TEST//[a-z]/}
不要使用%d
or echo
- 命令,因为带有前导的数字0
被理解为octal
答案4
要获取“最后一个数字”,请选择字符串末尾的任意数字序列,并将其转换为十进制数字:
使用重击:
[[ "$test" =~ ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"
使用 grep:
echo "$test" | grep -Po "[1-9][0-9]*$"