繁体   English   中英

如何提取字符串中的最后一个字段?

[英]How can I extract the last field in a string?

如何提取字符串中的最后一个字段? 我有一个字符串:

xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1

我想提取字符串的最后一部分,即VGA1

如果字符串有分隔符,您可以使用revcut ,如您的情况:

var="xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1"
rev <<< "$var" | cut -f1 -d' ' | rev
# output => VGA1
  • 第一个rev反转字符串,以便最后一个标记移动到开头,但相反
  • cut -f1提取第一个字段,使用空格作为分隔符
  • 第二个rev将提取的字段反转为其原始状态

这个解决方案的好处是它不依赖于最后一个标记之前有多少个字段。


相关文章: 如何使用“剪切”找到最后一个字段

如果这个字符串总是包含相同数量的空格,我们可以将每个空格分隔的部分视为一个字段,并使用cut提取它:

$ echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | cut -d' ' -f7
VGA1

如果不是这种情况,我们可以使用正则表达式从末尾进行匹配,例如使用grep

$ echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | grep -o '[^ ]*$'
VGA1

仅使用 Bash 内置命令(无外部命令)的一种方法:

var="xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1"
[[ "$var" =~ [[:space:]]([^[:space:]]+)([[:space:]]*)$ ]]
match="${BASH_REMATCH[1]-}"

请注意所使用的正则表达式将容忍字符串中的尾随空格; 如果将其视为错误而不是功能,则可以简化以避免这种情况:

[[ "$var" =~ [[:space:]]([^[:space:]]+)$ ]]

我采取了不同的方法:

echo "xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1" | \
sed 's/ /\
/g' | tail -n1

我会使用 awk:

$ awk '{print $NF}' <<< 'xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1'
VGA1

NF是记录字段的数量,和$NF打印领域拥有数NF ,即最后一个。 默认情况下,字段以空格分隔。

或者,使用 shell 参数扩展:

$ str='xres = 0: +*VGA1 1600/423x900/238+0+0  VGA1'
$ echo "${str##* }"
VGA1

这将从开头删除最长的匹配字符串,其中要匹配的模式是* :“任何内容,后跟一个空格”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM