假设我有字符串1:2:3:4:5,我想要得到它的最后一个字段(在本例中是5)。我如何使用Bash做到这一点?我试过cut,但我不知道如何用-f指定最后一个字段。


当前回答

一个方法:

var1="1:2:3:4:5"
var2=${var1##*:}

另一个,使用数组:

var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}

还有一个数组:

var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}

使用Bash(版本>= 3.2)正则表达式:

var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}

其他回答

echo "a:b:c:d:e"|xargs -d : -n1|tail -1

首先使用xargs使用“:”分割它,-n1意味着每一行只有一个部分。然后,弹簧最后一部分。

sed中的正则表达式匹配是贪婪的(总是到最后一个出现),你可以在这里使用它:

$ foo=1:2:3:4:5
$ echo ${foo} | sed "s/.*://"
5

另一种方法是将前后剪反:

$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef

这使得获取倒数第二个字段或从末尾开始编号的任何字段范围非常容易。

使用Bash。

$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo  \$${#}
0

你可以使用字符串操作符:

$ foo=1:2:3:4:5
$ echo ${foo##*:}
5

这将从前面到':'贪婪地修剪所有内容。

${foo  <-- from variable foo
  ##   <-- greedy front trim
  *    <-- matches anything
  :    <-- until the last ':'
 }