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

Regex 为什么sed匹配最小字符串而不是最大字符串?,regex,sed,terminal,Regex,Sed,Terminal,我正试图从一堆文件中提取数字(0.000500),这些文件是aláeta_x2-0.000500。 我想下面这行就可以了,但我只得到了0,而不是0.000500 我怎样才能获得最大匹配 find eta* | sed 's/.*\([0-9.]\+\)/\1/g' 在sed中最后一个数字之前添加-,g是无用的 find eta* | sed 's/.*-\([0-9.]\+\)/\1/' 在sed中最后一个数字之前添加-,g是无用的 find eta* | sed 's/.*-\([0-

我正试图从一堆文件中提取数字(
0.000500
),这些文件是alá
eta_x2-0.000500
。 我想下面这行就可以了,但我只得到了
0
,而不是
0.000500

我怎样才能获得最大匹配

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

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

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

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

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

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

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

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

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

*
是贪婪的,因此它将匹配尽可能多的字符。在这种情况下,
*
将匹配
eta_x2-0.00050
和您组中匹配的最后一个
0

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

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

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

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

由于
*
是贪婪的,因此它将匹配尽可能多的字符。在这种情况下,
*
将匹配
eta_x2-0.00050
和您组中匹配的最后一个
0

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

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

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

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

由于
*
是贪婪的,因此它将匹配尽可能多的字符。在这种情况下,
*
将匹配
eta_x2-0.00050
和您组中匹配的最后一个
0

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

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

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

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

由于
*
是贪婪的,因此它将匹配尽可能多的字符。在这种情况下,
*
将匹配
eta_x2-0.00050
和您组中匹配的最后一个
0

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

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

sed 's/.*[^0-9.]\([0-9.]\+\)/\1/g'
当然,如果您知道所需的数字将紧跟在
-
之后,您可以将
[^0-9.]
替换为
-
,其工作方式相同。

不需要sed

find eta* | grep -oP '(?<=-)[\s.]+'
find eta* | cut -d'-' -f 2
查找eta*|grep-oP'(?不需要sed

find eta* | grep -oP '(?<=-)[\s.]+'
find eta* | cut -d'-' -f 2
查找eta*|grep-oP'(?不需要sed

find eta* | grep -oP '(?<=-)[\s.]+'
find eta* | cut -d'-' -f 2
查找eta*|grep-oP'(?不需要sed

find eta* | grep -oP '(?<=-)[\s.]+'
find eta* | cut -d'-' -f 2
查找eta*|grep-oP'(?这应该可以-

find eta* | sed 's/[^-]*-\([0-9]*\.[0-9]*\)/\1/'
这应该是有效的-

find eta* | sed 's/[^-]*-\([0-9]*\.[0-9]*\)/\1/'
这应该是有效的-

find eta* | sed 's/[^-]*-\([0-9]*\.[0-9]*\)/\1/'
这应该是有效的-

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

感谢F.J.我非常关注结尾部分,为什么它看起来不那么贪婪,我忘记了第一个。这个概念让我在sed中搜索贪婪。事实证明,我可能在寻找的是
perl
,它支持非贪婪修饰符,作为奖励,它不需要太多的\转义。此外,perl还有有用的sh或者像\d和\w这样的函数。这样我就可以得到:
find eta*| perl-pe的|.*(\d+\.\d+)|\1 |’
。使用sed和perl似乎速度一样快。那么为什么还有人会使用sed呢?感谢F.J。我非常关注结尾部分,为什么它看起来并不贪婪,我忘记了第一个。这个概念让我在sed中搜索greedness。结果是,我可能在寻找的是
perl
,它支持n在贪婪修饰符上,作为奖励,不需要太多的转义。此外,perl还有有用的速记,如\d和\w。因此,我可以使用这些速记:
find eta*| perl-pe的|*(\d+\.\d+)|\1 |’
。使用sed和perl似乎速度一样快。那么为什么还有人会使用sed呢?感谢F.J。我非常关注结尾部分,为什么它看起来并不贪婪,我忘记了第一个。这个概念让我在sed中搜索greedness。结果是,我可能在寻找的是
perl
,它支持n在贪婪修饰符上,作为奖励,不需要太多的转义。此外,perl还有有用的速记,如\d和\w。因此,我可以使用这些速记:
find eta*| perl-pe的|*(\d+\.\d+)|\1 |’
。使用sed和perl似乎速度一样快。那么为什么还有人会使用sed呢?感谢F.J。我非常关注结尾部分,为什么它看起来并不贪婪,我忘记了第一个。这个概念让我在sed中搜索greedness。结果是,我可能在寻找的是
perl
,它支持n在贪婪修饰符上,作为奖励,不需要太多的转义。另外,perl有有用的速记,如\d和\w。因此,我可以得到:
find eta*| perl-pe's |*(\d+.\d+)\124;\ 1 |
。使用,sed和perl似乎同样快。