首页 > 解决方案 > sed 模式匹配,在第一个找到的字符处停止

问题描述

取字符串“hello_world 1 2 3”

我希望输出为“hello_world”

我的尝试是“s/\(.*\) .*/\1/g”

但我得到“hello_world 1 2”

它不是在序列后的第一个空格处停止,而是在该行的最后一个空格处停止。

我想取任意长度的字符 \(.*\) 后跟一个空格 ' ' 并删除它后面的任何内容。*

我该怎么做?

标签: sed

解决方案


请您尝试以下操作。

echo "hello_world 1 2 3" | sed 's/\([^ ]*\).*/\1/'

上面的解释:

使用sed将匹配的正则表达式存储到临时缓冲区中的能力。稍后可以通过诸如 等变量访问12取决于您提到的缓冲区数量)。

在这里,我们捕获所有内容,直到第一个空间出现到第一个临时缓冲区中,然后保持一切原样.*。在替换时,我们在\1这里提到这意味着用第一个临时缓冲区(即 )的第一个匹配/存储的值替换整行的值hello_world

为什么 OP 的代码不起作用:因为 OP 使用.*它是一个贪婪匹配的正则表达式并捕获第一个缓冲区本身中的所有行,这就是为什么当它使用\1它实际打印整行时。


推荐阅读