使用 grep 进行组匹配包括额外字符

dev*_*ium 4 grep regular-expression

我想在 bash 中使用正则表达式提取一些文本,因此我决定尝试以下简单示例。

echo "abc def ghi" | grep -Po " \K(.*?) "
Run Code Online (Sandbox Code Playgroud)

我期待得到一个"def",但令我惊讶的"def "是我得到了一个(最后一个额外的空间)。

我有兴趣了解为什么最后grep还要包含额外的空间以及如何摆脱它。我知道我可以用另一行对结果进行后处理,但我有兴趣用 grep 解决这个问题。

use*_*890 5

简而言之:

\K
Run Code Online (Sandbox Code Playgroud)

导致 grep 保留\K之前的所有内容,而不将其包含在匹配中。它不会影响什么来\K()

这可能就足够了:

" \K(.+)(?= )"
Run Code Online (Sandbox Code Playgroud)

(?= )非捕获组在哪里。

或者更好:

" \K([^ ]+)(?= )"
" \K(\w+)(?= )"
Run Code Online (Sandbox Code Playgroud)

或类似。