syk*_*ker 166 regex shell command-line grep regex-greedy
我想grey最短的比赛,模式应该是这样的:
<car ... model=BMW ...>
...
...
...
</car>
Run Code Online (Sandbox Code Playgroud)
...表示任何字符,输入是多行.
Mar*_*ers 257
你正在寻找一种非贪婪(或懒惰)的比赛.要在正则表达式中获得非贪婪的匹配,您需要?在量词之后使用修饰符.例如,您可以更改.*为.*?.
默认情况下grep不支持非贪婪修饰符,但您可以使用grep -PPerl语法.
小智 81
Actualy .*?唯一的作品perl.我不确定等效的grep扩展regexp语法是什么.幸运的是,你可以使用grep的perl语法,所以grep -P可以工作,但是grep -E相同的egrep不起作用(它会贪婪).
另见:http://blog.vinceliu.com/2008/02/non-greedy-regular-expression-matching.html
小智 11
尝试在这个帖子中的东西后,我的grep工作:
echo "hi how are you " | grep -shoP ".*? "
Run Code Online (Sandbox Code Playgroud)
只需确保为每一行添加空格即可
(我的是一行一行搜索吐出的话)
ken*_*orb 11
grep对于非贪婪的匹配,grep您可以使用否定的字符类.换句话说,尽量避免使用通配符.
例如,要从页面内容中获取jpeg文件的所有链接,您可以使用:
grep -o '"[^" ]\+.jpg"'
Run Code Online (Sandbox Code Playgroud)
要处理多行,xargs首先通过管道输入.为了性能,请使用ripgrep.
小智 6
抱歉,我迟到了 9 年,但这可能对 2020 年的观众有用。
所以假设你有一行像"Hello my name is Jello". 'H'现在您想要查找以 开头和结尾的单词'o',其间可以有任意数量的字符。我们不需要台词,我们只需要文字。为此,我们可以使用以下表达式:
grep "H[^ ]*o" file
Run Code Online (Sandbox Code Playgroud)
这将返回所有单词。其工作原理是:它将允许所有字符而不是中间的空格字符,这样我们就可以避免同一行中出现多个单词。
现在您可以将空格字符替换为您想要的任何其他字符。假设初始行是"Hello-my-name-is-Jello",那么您可以使用以下表达式获取单词:
grep "H[^-]*o" file
Run Code Online (Sandbox Code Playgroud)