对不起,我会解释得更清楚如何从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?”是我想要的命令/脚本
1dkrff031#
你只需要grep -Eo '[0-9]+$':
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
字符串
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
tvmytwxo3#
您可以将grep与
grep
rev <<< "$str" | grep -Eo "[0-9]*" | head -1 |rev
字符串编辑:当我使用tail -1时,rev是不需要的,但是当你像@Vasiliou那样添加行尾标记$时,头/尾就有点过头了(我对他的答案投了赞成票)。如果没有rev和head,grep解决方案优于sed。“我删除了我的评论“更好的是使用sed“。
tail -1
rev
$
head
sed
sed -r 's/.*[^0-9]+([0-9]*)$/\1/' <<< "$str"
型
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
sg24os4d5#
从字符串中获取所有数字:
grep -Eo '[0-9]+'
从字符串中获取最后一个数字:
grep -Eo '[0-9]+' | tail -1
型(对乔治的回答稍有补充)
-E
-o
bhmjp9jg6#
短 gawk 方法(多变量):
echo "$str1 $str2 $str3 $str4 " | awk -v FPAT="[0-9]+ " '{for(i=1;i<=NF;i++) print "str"i": "$i}'
字符串输出:
FPAT="[0-9]+ "
当你改变了你的初始条件:对于单个字符串,它甚至更简单:
echo djfs1d2.3 | awk -v FPAT="[0-9]+" '{print $NF}' 3
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]}来提取号码。
${BASH_REMATCH[1]}
ua4mk5z48#
刚刚发现了一种在纯Bash中实现这一点的有效方法,没有管道或显式条件:
# ## Erase all occurrences of pattern from beginning of string: # * Absolutely anything # [![:digit:]] Single non-digit character num="${str##*[![:digit:]]}"
8条答案
按热度按时间1dkrff031#
你只需要
grep -Eo '[0-9]+$'
:字符串
mutmk8jj2#
可以在extglob中使用参数扩展。首先,从末尾删除数字,然后从开头删除您得到的数字。
字符串
tvmytwxo3#
您可以将
grep
与字符串
编辑:当我使用
tail -1
时,rev
是不需要的,但是当你像@Vasiliou那样添加行尾标记$
时,头/尾就有点过头了(我对他的答案投了赞成票)。如果没有rev
和head
,grep
解决方案优于sed
。“我删除了我的评论“更好的是使用sed
“。型
w3nuxt5m4#
使用awk:
输入:
字符串
命令:
型
产出:
型
sg24os4d5#
从字符串中获取所有数字:
字符串
从字符串中获取最后一个数字:
型
(对乔治的回答稍有补充)
-E
表示扩展正则表达式-o
表示在单独的行上打印每个匹配部分bhmjp9jg6#
短 gawk 方法(多变量):
字符串
输出:
型
FPAT="[0-9]+ "
-匹配字段的正则表达式,而不是匹配字段分隔符当你改变了你的初始条件:
对于单个字符串,它甚至更简单:
型
cuxqih217#
不需要派生一个子进程,因为在bash中有regexp匹配。例如,假设字符串
字符串
现在你可以
型
这里的技巧是把括号放在组成数字的那部分模式周围。这允许您使用
${BASH_REMATCH[1]}
来提取号码。ua4mk5z48#
刚刚发现了一种在纯Bash中实现这一点的有效方法,没有管道或显式条件:
字符串