Linux 提取数字组

Linux 提取数字组,linux,sed,Linux,Sed,我试图提取如下所示的数字,但屏幕上没有打印任何内容: echo "This is an example: 65 apples" | sed -n 's/.*\([0-9]*\) apples/\1/p' 但是,如果两个数字分别匹配,则得到“65”,如下所示: echo "This is an example: 65 apples" | sed -n 's/.*\([0-9][0-9]\) apples/\1/p' 65 如何匹配一个数字,使我不知道要提取的数字的位数,例如,它可以是234

我试图提取如下所示的数字,但屏幕上没有打印任何内容:

echo "This is an example: 65 apples" | sed -n  's/.*\([0-9]*\) apples/\1/p'
但是,如果两个数字分别匹配,则得到“65”,如下所示:

echo "This is an example: 65 apples" | sed -n  's/.*\([0-9][0-9]\) apples/\1/p'
65

如何匹配一个数字,使我不知道要提取的数字的位数,例如,它可以是2344而不是65?

您看到的是正则表达式的贪婪行为。在您的第一个示例中,
*
将所有数字都占满。像这样的东西可以:

echo "This is an example: 65144 apples" | sed -n  's/[^0-9]*\([0-9]\+\) apples/\1/p'
65144

这样,您就无法匹配第一位中的任何数字。一些正则表达式方言有一种要求非贪婪匹配的方法,但我不相信
sed
有这种方法。

这是因为你的第一个
*
是贪婪的,而你的
[0-9]*
允许0或更多数字。
$ echo "This is an example: 65 apples" | sed -r  's/^[^0-9]*([0-9]+).*/\1/'
65
因此,
*
会尽可能多地吞噬(包括数字),而
[0-9]*
则不匹配任何内容

你可以做:

echo "This is an example: 65 apples" | sed -n  's/.*\b\([0-9]\+\) apples/\1/p'
其中,我强制
[0-9]
至少匹配一个数字,并且在数字之前添加了一个单词边界,以便匹配整个数字

但是,使用
grep
更容易,您只需匹配数字:

echo "This is an example: 65 apples" | grep -P -o '[0-9]+(?= +apples)'
-p
表示“perl regex”(因此我不必担心转义“+”)

-o
表示“仅打印匹配项”

(?=+apples)
表示匹配后面跟单词apples的数字

echo "This is an example: 65 apples" | ssed -nR -e 's/.*?\b([0-9]*) apples/\1/p'

但是,您需要超级sed才能使其工作。-R允许perl regexp.

从字符串中提取所有数字的简单方法

echo "1213 test 456 test 789" | grep -P -o "\d+"
结果是:

1213
456
789

我认为sed没有识别非贪婪的
标识符。第一个示例现已修复!(并且在我之前的评论之前已经修复)我喜欢这个想法,但是对于阅读本文的人来说,macOS上不支持grep-P。+1,但是要注意的是,并非所有的sed都支持-r,因此不能使用“+”修饰符,并且必须避开paren。为什么像
[([0-9]*)apple]
()这样的正则表达式在sed中不起作用?它在python中工作得很好。所以^[^0-9]*对应于行首非数字的所有内容。[0-9]+到至少一位数或更多,对吗?@AbhijeetRastogi:因为我们使用的是替换,所以我们需要对整个行进行说明。行的任何未说明的部分都将成为输出的一部分。如果在Python中使用模式搜索(而不是替换),则不会出现这种情况。@codaddict Oops。我的错。我真傻。这是替代。谢谢