Regex 使用sed从文本行提取float?

Regex 使用sed从文本行提取float?,regex,replace,sed,Regex,Replace,Sed,我在一行上发出一个sed替换,试图提取一个特定的浮点值,但所有看起来匹配的都是十进制的右边 文本行: 63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs] 如果我发行s/^.*\([0-9]*\.[0-9]*\):\[Tenur

我在一行上发出一个sed替换,试图提取一个特定的浮点值,但所有看起来匹配的都是十进制的右边

文本行:

63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]
如果我发行
s/^.*\([0-9]*\.[0-9]*\):\[Tenured:.*$/\1/
,我的输出是:

.546

我想把
63.546
排除在外。为什么第一个
[0-9]*
不匹配?

我的感觉是你的。*一开始表现得贪婪,所以它吸收了所有东西,但我可能错了


不要使用sed。我放弃了。perl是一个更好的选择(我开始使用它),但awk的解决方案打败了我。去吧,除非你真的因为某种特殊原因喜欢sed…

正如Stefano指出的,该模式在文本输入的开始执行贪婪匹配

如果可以使用perl,则此命令可用于匹配标准输入上的行:

perl -e '<STDIN> =~ m/^.*?([\d]+\.[\d]+):\s+\[Ten/ && print "$1\n";'
perl-e'=~m/^.*([\d]+\.[\d]+):\s+\[Ten/&打印“$1\n”;”

使用awk代替sed。为什么要费心创建复杂的正则表达式呢

$ more file
63.544: [GC 63.544: [DefNew: 575K->63K(576K), 0.0017902 secs]63.546: [Tenured: 1416K->1065K(1536K), 0.0492621 secs] 1922K->1065K(2112K), 0.0513331 secs]

$ awk -vRS="]" -F":" '$1+0==$1{print $1}' file
63.544
63.546

还要在所需号码之前匹配
]

s/^.*]\([0-9]*\.[0-9]*\): \[Tenured:.*$/\1/ s/^.*\([0-9]*\.[0-9]*\):\[终身制:.*$/\1/ 根据下面的评论,这里有一种更通用的方法,首先匹配非数字:

s/^.*[^0-9]\([0-9]*\.[0-9]*\): \[Tenured:.*$/\1/
s/^.[^0-9]\([0-9]*.[0-9]*\):\[Tenured:.*$/\1/我也这么想,但如果不是这样的话,我想就不会匹配浮点的右侧了?嗯……谢谢你的帮助:)+1建议Perl(做正则表达式的更好方法),而且你的答案是正确的,“*”是贪婪的,会吞噬小数点前的所有内容。这就是问题所在。我认为sed不支持非贪婪的调用。很好…我刚刚从上面删除了该解决方案。是的,sed不支持上述构造。@Xepoch执行了
[^\d]*
help you?刚刚尝试了两个更新示例,它们都产生了与上面相同的输出,没有左侧。我喜欢awk。但是,这个sed片段来自一个更大的sed脚本中的一长串操作,充当穷人的解析器生成器,sed可以做一些事情,让awk不满意。“sed可以做一些让awk缺少的事情”--你听说过令人惊叹的awk汇编程序吗?我需要保持上下文无关,但还有其他JVM GC选项可以/将其他数据放在那里。我可以根据经验选择所有组合。好的,那么先匹配任何非数字如何。请参阅我的编辑。