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


47

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

例:

echo "foo 'bar'" | grep -oE "'([^']+)'"

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

Answers:


50

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

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

或者,没有-E选择:

sed "s/.*'\([^']\+\)'.*/\1/"

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

sed -n "s/.*'\([^']\+\)'.*/\1/p"

谢谢,忘记了sed。但需要澄清的是,sed不接受-E的论点
。– Torandi

嗯,它可以在我的机器(Mac OS X)上使用。经过进一步检查,在手册页中:“ -E,-a和-i选项是非标准的FreeBSD扩展,可能在其他操作系统上不可用。”
jtbandes

1
-r在我看来。
Torandi

1
@jtbandes:您不需要的扩展功能,该表达式..我只是需要3个转义字符的( ) +使用\( \) \+:这实际上是相同的:sed "s/.*'\([^']\+\)'.*/\1/"
Peter.O

2
这不适用于多行输入。为此,您需要: sed -n "s/.*'\([^']\+\)'.*/\1/p"
phreakhead 2012年

28

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

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


8
grep -P并非在所有平台上都可用。但是,如果是这样,则使用先行/后行是解决问题的一种很好的方法。
塞巴斯蒂安2012年

1
grep具有后置断言是否明智?经过长时间的回顾,它的效果如何?它会将正则表达式与正则表达式的其余部分集成到某种“后缀树”中吗?
罗斯·罗杰斯

3

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

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

仅GNU grep。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.