为什么sed匹配最小而不是最大字符串?

时间:2014-02-11 00:46:29

标签: regex sed terminal

我正在尝试从一堆文件中提取数字{0.000500eta_x2-0.000500。 我认为下面的行会这样做,但我只得到0而不是0.000500

如何获得最大匹配?

find eta* | sed 's/.*\([0-9.]\+\)/\1/g'

4 个答案:

答案 0 :(得分:2)

.*是贪婪的,因此它将匹配尽可能多的字符。在这种情况下,.*将与eta_x2-0.00050匹配,只与您小组中匹配的最终0匹配。

通常这里的答案是使用.*?使用非贪婪的匹配,但我认为sed不支持。

你应该能够通过在开始匹配之前要求有一个非数字字符来实现这一点,这样.*必须在消费数字之前停止:

sed 's/.*[^0-9.]\([0-9.]\+\)/\1/g'

当然,如果您知道所需的数字将在-之后立即知道,则可以将[^0-9.]替换为-,它将以相同的方式工作。

答案 1 :(得分:1)

在最后一个数字之前的sed中添加-,g是无用的。

find eta* | sed  's/.*-\([0-9.]\+\)/\1/'

答案 2 :(得分:0)

不需要sed

find eta* | grep -oP '(?<=-)[\s.]+'
find eta* | cut -d'-' -f 2

答案 3 :(得分:0)

这应该有效 -

find eta* | sed 's/[^-]*-\([0-9]*\.[0-9]*\)/\1/'