用sed从文本行中提取浮点数?

时间:2009-11-06 15:21:18

标签: 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]*\): \[Tenured:.*$/\1/,我的输出是:

.546

我想要63.546出线。为什么第一个[0-9]*不匹配?

4 个答案:

答案 0 :(得分:3)

我的感觉是,你的。*在开始时表现得很贪婪,所以它吸收了一切到达点,但我可能是错的。

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

答案 1 :(得分:2)

使用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

答案 2 :(得分:2)

还要匹配所需数字之前的]

s/^.*]\([0-9]*\.[0-9]*\): \[Tenured:.*$/\1/

以下评论中,这是一种更通用的方法,首先匹配非数字:

s/^.*[^0-9]\([0-9]*\.[0-9]*\): \[Tenured:.*$/\1/

答案 3 :(得分:1)

正如Stefano指出的那样,该模式在文本输入的开头处执行了一个贪婪的匹配。

如果你可以使用perl,这个命令可以匹配你在标准输入上的行:

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