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


当前回答

对不起,我不能评论,但在这里; 来自@mateusz-piotrowski @user3133260的答案,

回声“e b: c: d::::::“| tr ':' ' ' | xargs | tr ' ' ' \ n ' |尾1

首先,tr ':' ' ' ->将':'替换为空格

然后,用xargs修整

之后,tr ' ' '\n' ->将保留的空格替换为换行符

最后,tail -1 ->得到最后一个字符串

其他回答

如果你想使用cut,你可以尝试这样做:

echo "1:2:3:4:5" | cut -d ":" -f5

你也可以像这样使用grep try:

echo " 1:2:3:4:5" | grep -o '[^:]*$'

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

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

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

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

使用read内置的解决方案:

IFS=':' read -a fields <<< "1:2:3:4:5"
echo "${fields[4]}"

或者,让它更通用:

echo "${fields[-1]}" # prints the last item

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

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

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

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

假设使用相当简单(例如,没有转义分隔符),您可以使用grep:

$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5

分解-找到行($)末尾的所有字符,而不是分隔符([^:])。-o只打印匹配的部分。