我在一行上发出一个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]*
不匹配?
答案 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";'