抱歉,我会更好地解释一下。
如何从字符串中获取最后一个数字?
一些通用字符串的示例:
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?" 是我想要的命令/脚本
"抱歉,我会更好地解释一下。
如何从字符串中获取最后一个数字?
一些通用字符串的示例:
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?" 是我想要的命令/脚本
"你只需要 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
#!/bin/bash
shopt -s extglob
for str in str1s2 djfs1d2.3 fefwfw4rfe45 234ef8 ; do
without_number=${str%%+([0-9])}
echo ${str#$without_number}
done
man bash
的第1403行左右...我已经做了很长时间 :)
) - David C. Rankin您可以使用 grep
与
rev <<< "$str" | grep -Eo "[0-9]*" | head -1 |rev
编辑:
当我使用tail -1
时,不需要rev
,但是当你像@Vasiliou一样仅添加行尾标记$
时,head/tail过于复杂(我已经点赞了他的答案)。没有rev
和head
,grep
解决方案比sed
更好。
我删除了我的备注“最好使用sed
”。
sed -r 's/.*[^0-9]+([0-9]*)$/\1/' <<< "$str"
E
是用于扩展表达式的,o
是用于在不同行上显示所有匹配的子字符串。我编辑了我的答案,@GeorgeVasiliou 给出了更好的答案(您可以将所选答案切换到他的答案)。 - Walter Agrep -Eo '[0-9]+'
grep -Eo '[0-9]+' | tail -1
对George的回答进行一些扩展..
-E
表示扩展正则表达式-o
表示将每个匹配部分单独打印到一行使用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
简短的 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
awk -v FPAT="[0-9]+ " '{print $NF}'
这种 FPAT 方法回答 OP 的问题。 - George Vasiliou# ## Erase all occurrences of pattern from beginning of string:
# * Absolutely anything
# [![:digit:]] Single non-digit character
num="${str##*[![:digit:]]}"
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]}
来获取该数字。