我想grep最短的匹配和模式应该是这样的:

<car ... model=BMW ...>
...
...
...
</car>

... 表示任意字符且输入为多行。


当前回答

grep

对于grep中的非贪婪匹配,您可以使用反字符类。换句话说,尽量避免使用通配符。

例如,要从页面内容中获取所有jpeg文件的链接,你可以使用:

grep -o '"[^" ]\+.jpg"'

要处理多行,首先通过xargs管道输入。为了提高性能,请使用ripgrep协议。

其他回答

您正在寻找一个非贪婪(或懒惰)匹配。要在正则表达式中获得一个非贪婪匹配,您需要使用修饰符?在量词之后。例如,可以将。*改为。*?。

默认情况下,grep不支持非贪婪修饰符,但是可以使用grep -P来使用Perl语法。

grep

对于grep中的非贪婪匹配,您可以使用反字符类。换句话说,尽量避免使用通配符。

例如,要从页面内容中获取所有jpeg文件的链接,你可以使用:

grep -o '"[^" ]\+.jpg"'

要处理多行,首先通过xargs管道输入。为了提高性能,请使用ripgrep协议。

我知道这有点死帖,但我刚刚注意到这是有效的。它从我的输出中删除了清理和清理。

> grep -v -e 'clean\-\?up'
> grep --version grep (GNU grep) 2.20

抱歉我迟到了9年,但这可能对2020年的观众有用。

假设你有一行“你好,我叫果冻”。 现在你想要找到以“H”开头,以“o”结尾的单词,中间有任意数量的字符。我们不需要台词,我们只需要文字。所以我们可以用这个表达式:

grep "H[^ ]*o" file

这将返回所有的单词。它的工作方式是:它将允许所有字符而不是空格字符之间,这样我们就可以避免在同一行中出现多个单词。

现在,您可以将空格字符替换为任何其他您想要的字符。 假设第一行是“hello -my-name-is-果冻”,那么你可以使用这样的表达式得到单词:

grep "H[^-]*o" file

实际上。*?只在perl中工作。我不确定等效的grep扩展regexp语法是什么。幸运的是,您可以在grep中使用perl语法,因此grep -P可以工作,但与egrep相同的grep -E将无法工作(它将是贪婪的)。

参见:http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html