我试图让 sed
输出它在一行文本中看到的第一个数字。这是我正在使用的命令:
sed 's/.*\([0-9]\+\).*/\1/g'
据我了解,这应该告诉 sed
从 stdin 获取输入,跳过一堆字符直到它命中一个数字,匹配并捕获该数字的一个或多个字符,然后跳过行中剩余的字符。但是,当我尝试通过管道传输某些内容时,这并不成立:
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 甚至不是输入中的第一个或最后一个数字,并且与一堆也匹配的字符组合在一起?另外,在这里使用的正确正则表达式是什么?
感谢您的帮助。
最佳答案
正则表达式的第一部分尽可能多地贪婪地匹配,并尽可能少地为匹配的下一部分保留,这是字符串中的最后一个数字 - 因为这个数字是内存使用的一部分,它可以在管道的不同执行之间发生变化。
如果您将正则表达式的第一部分设置为匹配任何非数字字符,那么它将挑选出您想要的数字:
tasklist | grep VBCSCompiler | sed 's/[^0-9]*\([0-9]\+\).*/\1/'
关于linux - 为什么 sed 将此替换的结果评估为 8?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40824936/