我试图让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甚至不是输入中的第一个或最后一个数字,并且与一堆也匹配的字符组合在一起?另外,在这里使用正确的正则表达式是什么?
感谢您的帮助。
答案 0 :(得分:2)
你的正则表达式的第一部分尽可能地贪婪地匹配,并且尽可能少地留下匹配的下一部分,这是字符串中的最后一位 - 因为这个数字是内存使用的一部分,它可以在管道的不同执行之间切换。
如果您将正则表达式的第一部分设置为匹配任何非数字字符,那么它将选择您想要的数字:
tasklist | grep VBCSCompiler | sed 's/[^0-9]*\([0-9]\+\).*/\1/'