linux 如何在bash中从string中获取最后一个数字?

xhv8bpkk  于 2023-08-03  发布在  Linux
关注(0)|答案(8)|浏览(133)

对不起,我会解释得更清楚
如何从string中得到最后一个数字?
泛型字符串示例:

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?”是我想要的命令/脚本

1dkrff03

1dkrff031#

你只需要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

字符串

mutmk8jj

mutmk8jj2#

可以在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

字符串

tvmytwxo

tvmytwxo3#

您可以将grep

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

字符串
编辑:当我使用tail -1时,rev是不需要的,但是当你像@Vasiliou那样添加行尾标记$时,头/尾就有点过头了(我对他的答案投了赞成票)。如果没有revheadgrep解决方案优于sed。“我删除了我的评论“更好的是使用sed“。

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

w3nuxt5m

w3nuxt5m4#

使用awk:
输入:

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

sg24os4d

sg24os4d5#

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

grep -Eo '[0-9]+'

字符串

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

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


(对乔治的回答稍有补充)

  • -E表示扩展正则表达式
  • -o表示在单独的行上打印每个匹配部分
bhmjp9jg

bhmjp9jg6#

gawk 方法(多变量):

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]+ "-匹配字段的正则表达式,而不是匹配字段分隔符

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

echo djfs1d2.3 | awk -v FPAT="[0-9]+" '{print $NF}'
3

cuxqih21

cuxqih217#

不需要派生一个子进程,因为在bash中有regexp匹配。例如,假设字符串

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


这里的技巧是把括号放在组成数字的那部分模式周围。这允许您使用${BASH_REMATCH[1]}来提取号码。

ua4mk5z4

ua4mk5z48#

刚刚发现了一种在纯Bash中实现这一点的有效方法,没有管道或显式条件:

# ##            Erase all occurrences of pattern from beginning of string:
# *             Absolutely anything
# [![:digit:]]  Single non-digit character

num="${str##*[![:digit:]]}"

字符串

相关问题