GNU Grep 可以输出选定的组吗?

Tor*_*ndi 56 linux grep

是否可以使用 GNU grep 从表达式中获取匹配的组?

例子:

echo "foo 'bar'" | grep -oE "'([^']+)'"
Run Code Online (Sandbox Code Playgroud)

这将输出“'bar'”。但我只想得到“bar”,而不必再通过 grep 发送一次(即获取匹配的组)。那可能吗?

jtb*_*des 55

您可以sed为此使用。在 BSD 上sed

echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
Run Code Online (Sandbox Code Playgroud)

或者,没有-E选项:

sed "s/.*'\([^']\+\)'.*/\1/"
Run Code Online (Sandbox Code Playgroud)

这不适用于多行输入。为此,您需要:

sed -n "s/.*'\([^']\+\)'.*/\1/p"
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于多行输入。为此,您需要:`sed -n "s/.*'\([^']\+\)'.*/\1/p"` (3认同)

小智 30

虽然 grep 无法输出特定组,但您可以使用先行和后行断言来实现您的目标:

echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"

  • `grep -P` 并非在所有平台上都可用。但如果是这样,使用前瞻/后视是解决问题的一个很好的方法。 (9认同)

dre*_*ewk 7

您可以使用\K重置和丢弃左侧匹配文本以及未添加到匹配文本的前瞻:

$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
Run Code Online (Sandbox Code Playgroud)

仅限 GNU grep。