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。我的错。我真傻。这是替代。谢谢