删除 bash 中的前导字符串

删除 bash 中的前导字符串

我有一个像这样的字符串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]/}

不要使用%dor echo- 命令,因为带有前导的数字0被理解为octal

答案4

要获取“最后一个数字”,请选择字符串末尾的任意数字序列,并将其转换为十进制数字:

使用重击:

 [[ "$test" =~  ([1-9][0-9]*)$ ]] && echo "number: $((10#${BASH_REMATCH[1]}))"

使用 grep:

echo "$test" | grep -Po "[1-9][0-9]*$"

相关内容