Regex 使用sed从文本行提取float?
我在一行上发出一个sed替换,试图提取一个特定的浮点值,但所有看起来匹配的都是十进制的右边 文本行: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
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选项可以/将其他数据放在那里。我可以根据经验选择所有组合。好的,那么先匹配任何非数字如何。请参阅我的编辑。