为什么sed会将此替换的结果评估为8?

时间:2016-11-27 01:31:23

标签: linux bash shell sed terminal

我试图让sed输出它在一行文字中看到的第一个数字。这是我使用的命令:

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

根据我的理解,这应该告诉sed从stdin获取输入,跳过一堆字符,直到它命中一个数字,匹配并捕获该数字的1个或多个字符,然后跳过其余字符这条线。但是,当我尝试通过它管道时,这并不成立:

james@DESKTOP-B1DARHA MINGW64 ~/Code/git/corefx (sparse-array-builder)
$ tasklist | grep VBCSCompiler
VBCSCompiler.exe             11080 Console                   33    155,944 K

james@DESKTOP-B1DARHA MINGW64 ~/Code/git/corefx (sparse-array-builder)
$ tasklist | grep VBCSCompiler | sed 's/.*\([0-9]\+\).*/\1/g'
8

我希望第二个命令的输出为11080,但它是8。为什么会发生这种情况,因为8甚至不是输入中的第一个或最后一个数字,并且与一堆也匹配的字符组合在一起?另外,在这里使用正确的正则表达式是什么?

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

你的正则表达式的第一部分尽可能地贪婪地匹配,并且尽可能少地留下匹配的下一部分,这是字符串中的最后一位 - 因为这个数字是内存使用的一部分,它可以在管道的不同执行之间切换。

如果您将正则表达式的第一部分设置为匹配任何非数字字符,那么它将选择您想要的数字:

tasklist | grep VBCSCompiler | sed 's/[^0-9]*\([0-9]\+\).*/\1/'