如何在bash中从字符串中获取最后一个数字?

时间:2017-05-20 19:23:31

标签: linux bash shell

抱歉,我会更好地解释

如何从字符串中获取最后一个数字?

泛型字符串的示例:

If str=str1s2
echo $str | cmd? 
I get 2

If str=234ef85
echo $str | cmd? 
I get 85

 If str=djfs1d2.3
echo $str | cmd? 
I get 3

"在cmd"是我想要的命令/脚本

7 个答案:

答案 0 :(得分:8)

您可以使用extglob参数扩展。首先,从末尾删除数字,然后删除从头开始的数据。

#!/bin/bash
shopt -s extglob
for str in str1s2 djfs1d2.3 fefwfw4rfe45 234ef8 ; do
    without_number=${str%%+([0-9])}
    echo ${str#$without_number}
done

答案 1 :(得分:7)

您需要的只是grep -Eo '[0-9]+$'

gv@debian:~$ echo 234ef85 |grep -Eo '[0-9]+$'          ## --> 85
gv@debian:~$ echo 234ef856 |grep -Eo '[0-9]+$'         ## --> 856
gv@debian:~$ echo 234ef85d6 |grep -Eo '[0-9]+$'        ## --> 6
gv@debian:~$ echo 234ef85d.6 |grep -Eo '[0-9]+$'       ## --> 6
gv@debian:~$ echo 234ef85d.6. |grep -Eo '[0-9]+$'      ## --> no result
gv@debian:~$ echo 234ef85d.6.1 |grep -Eo '[0-9]+$'     ## --> 1
gv@debian:~$ echo 234ef85d.6.1222 |grep -Eo '[0-9]+$'  ## --> 1222

答案 2 :(得分:4)

您可以将grep

一起使用
rev <<< "$str" | grep -Eo "[0-9]*" | head -1 |rev

编辑: 当我使用rev时不需要tail -1但是当你只是像@Vasiliou那样添加行尾标记$时,头部/尾部过度了(我赞成他的回答)。如果没有revhead,则grep解决方案优于sed。 我删除了我的评论“更好的是使用sed”。

sed -r 's/.*[^0-9]+([0-9]*)$/\1/' <<< "$str" 

答案 3 :(得分:3)

使用awk:

INPUT:

 str1 = "str1s2"
 str2 = "djfs1d2.3"
 str3 = "fefwfw4rfe45"
 str4 = "234ef8"

命令:

tr = \  < INPUT  |
awk '{ match($2,"[0-9]*\"$"); 
       printf "%s: %s\n", $1, substr($2,RSTART,RLENGTH-1);  }'

输出:

str1: 2
str2: 3
str3: 45
str4: 8

答案 4 :(得分:2)

gawk 方法(针对多个变量):

<div class="popover-navigation">
    <a data-role="prev" class="disabled" tabindex="-1">« Prev</a>
    <span data-role="separator">&nbsp;&nbsp;</span>
    <a data-role="next">Next »</a>
    <a data-role="end">End Tour</a>
</div>  

输出:

echo "$str1 $str2 $str3 $str4 " | awk -v FPAT="[0-9]+ " '{for(i=1;i<=NF;i++) print "str"i": "$i}'
  • str1: 2 str2: 3 str3: 45 str4: 8 - 与字段匹配的正则表达式,而不是匹配字段分隔符

因为你改变了你的初始条件:
对于一个单独的字符串,它甚至更简单:

FPAT="[0-9]+ "

答案 5 :(得分:1)

无需生成子进程,因为bash中有正则表达式匹配项。假设例如字符串

POST http://localhost/test01 404 (Not Found)
(anonymous) @ parser.js:39
dispatch @ jquery.min.js:2
v.handle @ jquery.min.js:2

现在您可以做

str=a34b56c

这里的窍门是在组成数字的模式部分周围加上括号。这使您可以使用if [[ $str =~ ([0-9]+)[^0-9]*$ ]] then echo The last number is ${BASH_REMATCH[1]} else echo The string "$str" does not contain digits fi 来接听电话号码。

答案 6 :(得分:0)

从字符串中获取所有数字:

grep -Eo '[0-9]+'

从字符串中获取最后一个数字:

grep -Eo '[0-9]+' | tail -1

(稍微扩展一下George的答案。)

  • -E表示扩展的正则表达式
  • -o表示打印匹配行的部分