2016-11-27 37 views
1

我试图让sed输出它在一行文本中看到的第一个数字。下面是我使用的命令:为什么sed会将此替换的结果评估为8?

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

据我了解,应该告诉sed采取从标准输入,跳过一串字符,直到它击中了许多,比赛和捕获1或更多字符号码,然后跳过该行中的其余字符。然而,这并不成立,当我通过它试图管道的东西:

[email protected] MINGW64 ~/Code/git/corefx (sparse-array-builder) 
$ tasklist | grep VBCSCompiler 
VBCSCompiler.exe    11080 Console     33 155,944 K 

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

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

感谢您的帮助。

回答

2

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

如果设置了正则表达式的第一部分,以匹配任何非数字字符,那么它会挑选出数你想:

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

天色已晚,当我回答了这个:)它不对结果产生影响,但我仍会更新。 –

相关问题