假设我有字符串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]}
其他回答
这里有很多很好的答案,但我仍然想用basename来分享这个:
basename $(echo "a:b:c:d:e" | tr ':' '/')
然而,如果字符串中已经有一些'/',它将失败。 如果斜杠/是你的分隔符,那么你就必须(也应该)使用basename。
这不是最好的答案,但它只是展示了如何创造性地使用bash命令。
使用sed:
$ echo '1:2:3:4:5' | sed 's/.*://' # => 5
$ echo '' | sed 's/.*://' # => (empty)
$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c
$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c
对不起,我不能评论,但在这里; 来自@mateusz-piotrowski @user3133260的答案,
回声“e b: c: d::::::“| tr ':' ' ' | xargs | tr ' ' ' \ n ' |尾1
首先,tr ':' ' ' ->将':'替换为空格
然后,用xargs修整
之后,tr ' ' '\n' ->将保留的空格替换为换行符
最后,tail -1 ->得到最后一个字符串
echo "a:b:c:d:e"|xargs -d : -n1|tail -1
首先使用xargs使用“:”分割它,-n1意味着每一行只有一个部分。然后,弹簧最后一部分。
使用Bash。
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0