非贪心匹配使用?用grep

Sve*_*ter 7 regex bash grep

我正在编写一个分析html文件的bash脚本,我想获取每个单元的内容<tr>...</tr>.所以我的命令看起来像:

$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'
Run Code Online (Sandbox Code Playgroud)

但它似乎grep给了我以下结果:

$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>'
Run Code Online (Sandbox Code Playgroud)

我怎么能.*不贪心?

Chr*_*our 14

如果你有,GNU Grep你可以-P用来使比赛非贪婪:

$ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>'
Run Code Online (Sandbox Code Playgroud)

-P选项启用Perl Compliant正则表达式(PCRE),这是非?基本正则表达式(BRE)和扩展正则表达式(ERE)非贪婪匹配所不支持的.

如果您正在使用,-P您也可以使用环顾四周来避免在匹配中打印标签,如下所示:

$ tr -d \\012 < price.html | grep -Po '(?<=<tr>).*?(?=</tr>)'
Run Code Online (Sandbox Code Playgroud)

如果您没有GNU grep并且HTML格式正确,您可以这样做:

$ tr -d \\012 < price.html | grep -o '<tr>[^<]*</tr>'
Run Code Online (Sandbox Code Playgroud)

注意:上面的示例不适用于嵌套标记<tr>.

  • 最后一个例子(使用"[^ <]*"不太可能工作,因为"tr"中不可避免地会有"td"或"th"标签. (3认同)