簡體   English   中英

如何從bash中的字符串中獲取最后一個數字?

[英]How can I get the last number from string in bash?

對不起,我會解釋得更好

如何從字符串中獲取最后一個數字?

泛型字符串的例子:

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

“命令?” 是我想要的命令/腳本

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

您可以通過 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

您可以將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" 

使用 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

從字符串中獲取所有數字:

grep -Eo '[0-9]+'

從字符串中獲取最后一個數字:

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

(稍微擴展喬治的回答..)

  • -E表示擴展正則表達式
  • -o表示在單獨的行上打印每個匹配的部分

簡短的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

無需生成子進程,因為您在 bash 中有正則表達式匹配。 假設例如字符串

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]}號碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM