假设我有字符串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]}

其他回答

如果你的最后一个字段是一个字符,你可以这样做:

a="1:2:3:4:5"

echo ${a: -1}
echo ${a:(-1)}

检查bash中的字符串操作。

这里有很多很好的答案,但我仍然想用basename来分享这个:

 basename $(echo "a:b:c:d:e" | tr ':' '/')

然而,如果字符串中已经有一些'/',它将失败。 如果斜杠/是你的分隔符,那么你就必须(也应该)使用basename。

这不是最好的答案,但它只是展示了如何创造性地使用bash命令。

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

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

对于那些熟悉Python的人来说,https://github.com/Russell91/pythonpy是解决这个问题的一个不错的选择。

$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'

将stdin的每一行都视为x。

使用该工具,可以很容易地编写应用于输入的python代码。

编辑(2020年12月): Pythonpy不再在线。 这里有一个替代方案:

$ echo "a:b:c:d:e" | python -c 'import sys; sys.stdout.write(sys.stdin.read().split(":")[-1])'

它包含更多的样板代码(即sys.stdout.read/write),但只需要来自python的STD库。

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

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