获取字符后的字符串

138

我有一个看起来像这样的字符串:

 GenFiltEff=7.092200e-01

使用bash,我想要获取等号=之后的数字。有没有办法做到这一点?

4
这个应该重新开启。How to grep 询问如何使用grep进行匹配,而这个问题则是询问如何获取字符后面的字符串...与 grep 无关。 - Jamie Hutber
5个回答

172
如果值已经存储在变量中,请使用参数扩展。
$ str="GenFiltEff=7.092200e-01"
$ value=${str#*=}

或使用 read

$ IFS="=" read name value <<< "GenFiltEff=7.092200e-01"

无论哪种方式,
$ echo $value
7.092200e-01

46
如果字符串中有多个“=”: 使用${str##*=}获取最后一个匹配项后面的内容。 使用${str#*=}获取第一个匹配项后面的内容。 使用${str%%=*}获取第一个匹配项之前的内容。 使用${str%=*}获取最后一个匹配项之前的内容。 字符串操作 @ tldp.org - lepe
我没有让第二个解决方案工作起来: $ IFS="=" read name value <<< "GenFiltEff=7.092200e-01" 使用bash 4.4.5 - sn1ckers
在我的4.4.5版本中运行良好。如果您无法解决问题,请开一个新的问题,并包含您得到的结果。 - chepner
2
如果这个答案能更详细地解释一下就太好了。#*= 这里具体是做什么的? - buildsucceeded
1
# 运算符从 $str 的扩展中省略与模式 *= 匹配的最短前缀。 - chepner

136
在第一个=之后且在下一个=之前的文本。
cut -d "=" -f2 <<< "$your_str"

或者

sed -e 's#.*=\(\)#\1#' <<< "$your_str"

对于第一个等号之后的所有文本,无论是否有多个等号。
cut -d "=" -f2- <<< "$your_str"

11
适用于简单情况,但当字符串中有多个“=”时,这些方法效果不佳。Chepner的第一个解决方案简单且更可靠。 - lepe
当使用 | 来运行命令链时,答案比使用变量更有用。 - Mohammad Yasir K P

25
echo "GenFiltEff=7.092200e-01" | cut -d "=" -f2 

请注意,如果分隔符不存在,您可以添加“-s”标志以不显示任何内容。 - Jules Sam. Randolph

6
这应该可以运行:
your_str='GenFiltEff=7.092200e-01'
echo $your_str | cut -d "=" -f2

5
${word:$(expr index "$word" "="):1}

假设您需要获取字符串中除第一个字符外的所有内容,可以省略掉:1这个参数。


$value = ${word:$(expr index "$word" "=")} 对我来说很有效,可以返回等号后面的所有内容。 - DTrejo

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