假设我有一个字符串
1:2:3:4:5
,我想要获取它的最后一个字段(在这种情况下是5
)。在Bash中如何实现?我尝试使用cut
,但我不知道如何使用-f
指定最后一个字段。使用Bash。
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
sed
中,正则表达式匹配是贪婪的(总是到最后一次出现),您可以在此处利用它:< /p >
$ foo=1:2:3:4:5
$ echo ${foo} | sed "s/.*://"
5
IFS=':' read -a fields <<< "1:2:3:4:5"
echo "${fields[4]}"
echo "${fields[-1]}" # prints the last item
echo "a:b:c:d:e"|xargs -d : -n1|tail -1
从 @mateusz-piotrowski 和 @user3133260 的回答中学习并改进,
echo "a:b:c:d::e:: ::" | tr ':' ' ' | xargs | tr ' ' '\n' | tail -1
首先,使用tr ':' ' ' -> 将冒号替换为空格
然后,使用xargs进行修剪
接着,使用tr ' ' '\n' -> 将剩余的空格替换为换行符
最后,使用tail -1 -> 获取最后一个字符串
for x in `echo $str | tr ";" "\n"`; do echo $x; done
对于那些熟悉Python的人来说,https://github.com/Russell91/pythonpy 是解决这个问题的不错选择。
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
-x 将stdin的每一行视为x
。$ echo "a:b:c:d:e" | python -c 'import sys; sys.stdout.write(sys.stdin.read().split(":")[-1])'
它包含更多的样板代码(即sys.stdout.read/write
),但只需要来自Python的标准库。
echo ${!#}
代替eval echo \$${#}
。 - Rafa Viotti