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

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

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


当前回答

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

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

grep "H[^ ]*o" file

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

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

grep "H[^-]*o" file

其他回答

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

> 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

我的grep工作后尝试的东西在这个线程:

echo "hi how are you " | grep -shoP ".*? "

只要确保每一行都有一个空格

(我的工作是逐行搜索,然后吐出单词)

简单的回答是使用下一个正则表达式:

(?s)<car .*? model=BMW .*?>.*?</car>

(?s) -这将跨多行进行匹配 . * ?-匹配任意字符,以惰性方式匹配次数(最少) 匹配)

一个(有点)复杂的答案是:

(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>

这样就可以匹配下面文本中的car1和car2

<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>

(..)表示捕获组 \1在这个上下文中匹配的文本与最近匹配的相同 捕获1号组