是否可以使用 GNU grep 从表达式中获取匹配的组?
例子:
echo "foo 'bar'" | grep -oE "'([^']+)'"
这将输出“'bar'”。但我想只获取“bar”,而不必再通过 grep 发送一次(即获取匹配的组)。这可能吗?
答案1
你可以使用sed
它。在 BSD 上sed
:
echo "foo 'bar'" | sed -E "s/.*'([^']+)'.*/\\1/"
或者,不带-E
选项:
sed "s/.*'\([^']\+\)'.*/\1/"
这不适用于多行输入。为此您需要:
sed -n "s/.*'\([^']\+\)'.*/\1/p"
答案2
虽然 grep 无法输出特定的组,但是您可以使用前瞻和后瞻断言来实现您的后续操作:
echo "foo 'bar'" | grep -Po "(?<=')[^']+(?=')"
答案3
您可以使用\K
重置和丢弃左侧匹配文本以及未添加到匹配文本的前瞻:
$ echo "foo 'bar'" | grep -oP "'\K[^']+(?=')"
bar
仅限 GNU grep。