假设我有字符串1:2:3:4:5,我想要得到它的最后一个字段(在本例中是5)。我如何使用Bash做到这一点?我试过cut,但我不知道如何用-f指定最后一个字段。
当前回答
这里有很多很好的答案,但我仍然想用basename来分享这个:
basename $(echo "a:b:c:d:e" | tr ':' '/')
然而,如果字符串中已经有一些'/',它将失败。 如果斜杠/是你的分隔符,那么你就必须(也应该)使用basename。
这不是最好的答案,但它只是展示了如何创造性地使用bash命令。
其他回答
假设使用相当简单(例如,没有转义分隔符),您可以使用grep:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
分解-找到行($)末尾的所有字符,而不是分隔符([^:])。-o只打印匹配的部分。
使用cut很难得到最后一个字段,但是这里有一些在awk和perl中的解决方案
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
这里有很多很好的答案,但我仍然想用basename来分享这个:
basename $(echo "a:b:c:d:e" | tr ':' '/')
然而,如果字符串中已经有一些'/',它将失败。 如果斜杠/是你的分隔符,那么你就必须(也应该)使用basename。
这不是最好的答案,但它只是展示了如何创造性地使用bash命令。
使用Bash。
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
对于那些熟悉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库。