我想grep最短的匹配和模式应该是这样的:
<car ... model=BMW ...>
...
...
...
</car>
... 表示任意字符且输入为多行。
我想grep最短的匹配和模式应该是这样的:
<car ... model=BMW ...>
...
...
...
</car>
... 表示任意字符且输入为多行。
当前回答
我的grep工作后尝试的东西在这个线程:
echo "hi how are you " | grep -shoP ".*? "
只要确保每一行都有一个空格
(我的工作是逐行搜索,然后吐出单词)
其他回答
您正在寻找一个非贪婪(或懒惰)匹配。要在正则表达式中获得一个非贪婪匹配,您需要使用修饰符?在量词之后。例如,可以将。*改为。*?。
默认情况下,grep不支持非贪婪修饰符,但是可以使用grep -P来使用Perl语法。
抱歉我迟到了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号组