如何在shell中分割字符串并获取最后一个字段
假设我有字符串 1:2:3:4:5
并且我想获取它的最后一个字段(在本例中为 5
)。我如何使用 Bash 来做到这一点?我尝试了 cut
,但我不知道如何使用 -f
指定最后一个字段。
Suppose I have the string 1:2:3:4:5
and I want to get its last field (5
in this case). How do I do that using Bash? I tried cut
, but I don't know how to specify the last field with -f
.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
您可以使用字符串运算符:
这会贪婪地修剪从前面到“:”的所有内容。
You can use string operators:
This trims everything from the front until a ':', greedily.
另一种方法是在
cut
之前和之后反转:这使得很容易获得最后一个字段,或从末尾编号的任何范围的字段。
Another way is to reverse before and after
cut
:This makes it very easy to get the last but one field, or any range of fields numbered from the end.
使用 cut 很难得到最后一个字段,但这里有 awk 和 perl 中的一些解决方案
It's difficult to get the last field using cut, but here are some solutions in awk and perl
假设用法相当简单(例如,没有转义分隔符),您可以使用 grep:
Breakdown - 查找行尾 ($) 处除分隔符 ([^:]) 之外的所有字符。 -o 只打印匹配的部分。
Assuming fairly simple usage (no escaping of the delimiter, for example), you can use grep:
Breakdown - find all the characters not the delimiter ([^:]) at the end of the line ($). -o only prints the matching part.
如果您想使用
cut
,您可以尝试这样的操作:您也可以使用
grep
尝试如下:You could try something like this if you want to use
cut
:You can also use
grep
try like this :一种方法:
另一种方法,使用数组:
另一种方法,使用数组:
使用 Bash(版本 >= 3.2)正则表达式:
One way:
Another, using an array:
Yet another with an array:
Using Bash (version >= 3.2) regular expressions:
只需将分隔符转换为换行符,然后使用
tail -1
选择最后一个条目。Simply translate the delimiter into a newline and choose the last entry with
tail -1
.使用 sed:
Using
sed
:这里有很多很好的答案,但我仍然想使用 basename 来分享这个答案:
但是,如果字符串中已经有一些“/”,它将会失败。
如果斜杠 / 是您的分隔符,那么您只需(并且应该)使用基本名称。
这不是最好的答案,但它只是展示了如何使用 bash 命令发挥创造力。
There are many good answers here, but still I want to share this one using basename :
However it will fail if there are already some '/' in your string.
If slash / is your delimiter then you just have to (and should) use basename.
It's not the best answer but it just shows how you can be creative using bash commands.
如果您的最后一个字段是单个字符,您可以执行以下操作:
检查 字符串操作bash。
If your last field is a single character, you could do this:
Check string manipulation in bash.
使用 Bash。
Using Bash.
sed
中的正则表达式匹配是贪婪的(总是到最后一次出现),您可以在此处利用它:Regex matching in
sed
is greedy (always goes to the last occurrence), which you can use to your advantage here:首先使用 xargs 使用“:”分割它,-n1 表示每一行只有一部分。然后,pring 最后一部分。
First use xargs split it using ":",-n1 means every line only have one part.Then,pring the last part.
使用 read 内置函数的解决方案:
或者,使其更通用:
A solution using the read builtin:
Or, to make it more generic:
改进 @mateusz-piotrowski 和 @user3133260 答案,
首先,tr ':' ' ' -> 然后用空格替换 ':',
然后用 xargs 进行修剪
,tr ' ' '\n' -> 最后将剩余的空格替换为换行符
,tail -1 ->获取最后一个字符串
improving from @mateusz-piotrowski and @user3133260 answer,
first, tr ':' ' ' -> replace ':' with whitespace
then, trim with xargs
after that, tr ' ' '\n' -> replace remained whitespace to newline
lastly, tail -1 -> get the last string
对于那些熟悉 Python 的人来说,https://github.com/Russell91/pythonpy 是一个不错的选择来解决这个问题。
来自 pythonpy 帮助:
-x 将 stdin 的每一行视为 x
。使用该工具,可以轻松编写应用于输入的 Python 代码。
编辑(2020 年 12 月):
Pythonpy 不再在线。
这是一个替代方案:
它包含更多样板代码(即 sys.stdout.read/write ),但仅需要来自 python 的 std 库。
For those that comfortable with Python, https://github.com/Russell91/pythonpy is a nice choice to solve this problem.
From the pythonpy help:
-x treat each row of stdin as x
.With that tool, it is easy to write python code that gets applied to the input.
Edit (Dec 2020):
Pythonpy is no longer online.
Here is an alternative:
it contains more boilerplate code (i.e.
sys.stdout.read/write
) but requires only std libraries from python.