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

标签 linux bash shell sed terminal

我试图让 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/

相关文章:

linux - 无法将新文件夹名称附加到 UNIX 脚本中的现有路径

linux - 当使用expect脚本中的交互处理ssh时,如何隐藏或编辑关闭ssh时的消息

PHP 在 exec() bash 脚本时挂起

regex - 如何让 grep 输出所有匹配的行?

jquery - HTML 文件属性问题

linux - 在哪里可以找到架构/设置源?

android - 为什么 nohup 仍然导致在 shell 脚本中运行的进程终止?

bash - 在 BASH 脚本中存储文件

mysql - 如何通过终端在mysql中连续上传文件的全文

linux - 从 shell 脚本中的输入接收时间戳