如何在Shell中拆分字符串并获取最后一个字段

395
假设我有一个字符串 1:2:3:4:5,我想要获取它的最后一个字段(在这种情况下是5)。在Bash中如何实现?我尝试使用cut,但我不知道如何使用-f指定最后一个字段。
17个回答

2

使用Bash。

$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo  \$${#}
0

1
可以使用 echo ${!#} 代替 eval echo \$${#} - Rafa Viotti

2
< p >在 sed 中,正则表达式匹配是贪婪的(总是到最后一次出现),您可以在此处利用它:< /p >
$ foo=1:2:3:4:5
$ echo ${foo} | sed "s/.*://"
5

1
一种使用read内置命令的解决方案:

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

或者,让它更加通用:
echo "${fields[-1]}" # prints the last item

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

首先使用xargs将其用“:”分割,-n1表示每行只有一个部分。然后打印最后一部分。

0

@mateusz-piotrowski 和 @user3133260 的回答中学习并改进,

echo "a:b:c:d::e:: ::" | tr ':' ' ' |  xargs | tr ' ' '\n' | tail -1

首先,使用tr ':' ' ' -> 将冒号替换为空格

然后,使用xargs进行修剪

接着,使用tr ' ' '\n' -> 将剩余的空格替换为换行符

最后,使用tail -1 -> 获取最后一个字符串


1
如果您想根据[答案]提供答案,请[编辑]以使其更明显。您可以基于现有答案提供答案;给予现有答案作者的信用非常适当,感谢您这样做。但是,我很难确定您所指的答案。请使用在该答案下方的“分享”链接获取链接,并在此处添加一个明确的链接。 - Yunnosch
1
你对评论特权的了解已经到了能够用言语表达的地步,但你并没有这个特权。你知道规则 https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-can-i-do-instead 。在这种情况下,请不要决定滥用其他机制(回答)来做一些它本来不应该做的事情,而且你还没有被允许这样做。 - Yunnosch
您的回答目前写得不清楚。请进行[编辑]以添加更多细节,以便其他人了解这如何回答所提出的问题。您可以在帮助中心找到有关撰写良好答案的更多信息。 - Community
感谢提醒,@Yunnosch。作为非英语母语者,我可能会犯错误。这段时间以来,我只是在 Stack Overflow 上寻找和阅读问题的答案,而不是回答问题。 - user8582041
你只是以某种程度上(在有些经验的情况下)代码本身就能清楚表述的方式描述了代码行为。请解释它实现了什么,即改进是什么。 - Yunnosch
抱歉,我是一个相当健忘的人。所以,我上次记得的改进方法是,避免在冒号(:)或空格之间有空值时失败。 - user8582041

0
for x in `echo $str | tr ";" "\n"`; do echo $x; done

2
如果任何字段中存在空格,则会遇到问题。此外,它并没有直接回答检索“最后一个”字段的问题。 - chepner

-2

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

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

从pythonpy帮助中得知:-x 将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的标准库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接