我希望到grep最短的匹配和模式应该是这样的:
<car ... model=BMW ...>
...
...
...
</car>
...指任何字符且输入是多行。
我希望到grep最短的匹配和模式应该是这样的:
<car ... model=BMW ...>
...
...
...
</car>
...指任何字符且输入是多行。
您正在寻找一个非贪婪(或懒惰)的比赛。 为了得到一个正则表达式,你需要使用修改非贪婪匹配?
之后的量词。 例如,您可以更改.*
至.*?
。
默认情况下grep
不支持非贪婪的改性剂,但可以使用grep -P
使用Perl语法。
Actualy的.*?
只适用于perl
。 我不知道相当于grep的扩展正则表达式的语法是什么。 幸运的是,你可以使用使用grep这样的Perl语法grep -P
的工作,但grep -E
作为相同egrep
是行不通的(这将是贪婪)。
参见: http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
grep
对于非贪婪匹配grep
你可以使用一个否定的字符类。 换句话说,尽量避免通配符。
例如,要获取所有链接中的JPEG页面内容的文件,你会使用:
grep -o '"[^" ]\+.jpg"'
为了应对多线,管通过输入xargs
第一。 为了提高性能,使用ripgrep
。
我的grep在这个线程尝试的东西之后的作品:
echo "hi how are you " | grep -shoP ".*? "
只要确保你添加一个空格,以你的每条线路
(我的是一个逐行搜索吐出的话)
简短的回答是使用下一个正则表达式:
(?s)<car .*? model=BMW .*?>.*?</car>
A(略)更复杂的答案是:
(?s)<([a-z\-_0-9]+?) .*? model=BMW .*?>.*?</\1>
这将使得可能匹配在下面的文本CAR 1和CAR2
<car1 ... model=BMW ...>
...
...
...
</car1>
<car2 ... model=BMW ...>
...
...
...
</car2>