如何做一个grep的非贪婪匹配?如何做一个grep的非贪婪匹配?(How to do a non-g

2019-05-13 06:01发布

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

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

...指任何字符且输入是多行。

Answer 1:

您正在寻找一个非贪婪(或懒惰)的比赛。 为了得到一个正则表达式,你需要使用修改非贪婪匹配? 之后的量词。 例如,您可以更改.*.*?

默认情况下grep不支持非贪婪的改性剂,但可以使用grep -P使用Perl语法。



Answer 2:

Actualy的.*? 只适用于perl 。 我不知道相当于grep的扩展正则表达式的语法是什么。 幸运的是,你可以使用使用grep这样的Perl语法grep -P的工作,但grep -E作为相同egrep是行不通的(这将是贪婪)。

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



Answer 3:

grep

对于非贪婪匹配grep你可以使用一个否定的字符类。 换句话说,尽量避免通配符。

例如,要获取所有链接中的JPEG页面内容的文件,你会使用:

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

为了应对多线,管通过输入xargs第一。 为了提高性能,使用ripgrep



Answer 4:

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

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

只要确保你添加一个空格,以你的每条线路

(我的是一个逐行搜索吐出的话)



Answer 5:

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

(?s)<car .*? model=BMW .*?>.*?</car>
  • (S) - 这使得跨多比赛
  • 。*? - 匹配任何字符,以惰性方式的次数(最小匹配)

A(略)更复杂的答案是:

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

这将使得可能匹配在下面的文本CAR 1和CAR2

<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>
  • (..)表示捕获组
  • \ 1在此上下文中sametext作为最近匹配通过捕获组号1匹配


文章来源: How to do a non-greedy match in grep?