sed模式匹配,在第一次找到字符时停止

sed模式匹配,在第一次找到字符时停止,sed,Sed,以字符串“hello_world 1 2 3”为例 我希望输出为“hello_world” 我的尝试是“s/\(.\)./\1/g” 但我得到“你好,世界12” 它不是在序列后的第一个空格处停止,而是获取行上的最后一个空格 我想取任意长度的字符\(.*\)后跟空格“”,并删除其后的任何内容。* 我怎么做呢?你能试试下面的吗 echo "hello_world 1 2 3" | sed 's/\([^ ]*\).*/\1/' 以上说明: 使用sed将匹配的正则表达式存储到临时缓冲区的功能。稍后可

以字符串“hello_world 1 2 3”为例

我希望输出为“hello_world”

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

但我得到“你好,世界12”

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

我想取任意长度的字符\(.*\)后跟空格“”,并删除其后的任何内容。*


我怎么做呢?

你能试试下面的吗

echo "hello_world 1 2 3" | sed 's/\([^ ]*\).*/\1/'
以上说明:

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

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


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

您可以尝试以下内容吗

echo "hello_world 1 2 3" | sed 's/\([^ ]*\).*/\1/'
以上说明:

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

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

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

这可能对您有用(GNU-sed):

匹配第一个空格字符及其后的所有字符并将其删除,保留前面的所有字符,即所有非空格字符

同:

sed 's/^(\S+).*/\1/' -E file
这可能适用于您(GNU-sed):

匹配第一个空格字符及其后的所有字符并将其删除,保留前面的所有字符,即所有非空格字符

同:

sed 's/^(\S+).*/\1/' -E file

关于您面临的问题,
*
匹配尽可能长的匹配,同时满足整个正则表达式,在本例中,它将是最后一个空格字符之前的字符。。。您还可以使用
cut-d'-f1
sed's/*/'
awk'{print$1}'
解决此问题。此外,优先级是从左到右的,这就是为什么
\(.*)
尽可能匹配,而不是在正则表达式末尾使用
*
解决您面临的问题的原因,
*
匹配尽可能长的匹配,同时满足整个正则表达式,在本例中,它将是最后一个空格字符之前的字符。。。您还可以使用
cut-d'-f1
sed's/*/'
awk'{print$1}'
解决此问题。此外,优先级是从左到右的,这就是为什么
\(.*)
尽可能匹配,而不是在正则表达式末尾使用
*