我正在编写一个bash脚本,它分析一个html文件,并希望获得每个<tr>...</tr>的内容。所以我的命令看起来是:
$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'但是grep似乎给了我以下结果:
$ tr -d \\012 < price.html | grep -oE '<tr>.*</tr>'我怎样才能使.*不贪婪呢?
发布于 2013-10-01 20:25:19
如果您有GNU Grep,则可以使用-P使匹配不贪婪:
$ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>'-P选项允许Perl兼容的正则表达式(PCRE),这是与?作为基本正则表达式(BRE)进行非贪婪匹配所必需的,而扩展正则表达式(ERE)不支持它。
如果使用的是-P,也可以使用环顾四周来避免打印匹配中的标记,如下所示:
$ tr -d \\012 < price.html | grep -Po '(?<=<tr>).*?(?=</tr>)'如果您没有GNU grep,并且HTML格式良好,那么您可以这样做:
$ tr -d \\012 < price.html | grep -o '<tr>[^<]*</tr>'注意:上面的示例不适用于<tr>__中的嵌套标记。
发布于 2013-10-01 20:26:21
非贪婪匹配不是grep -E支持的扩展正则表达式语法的一部分。如果有,则使用grep -P,或者切换到Perl / Python / Ruby /什么东西。(哦,还有pcregrep.)
当然,如果你真的是说
<tr>[^<>]*</tr>相反,您应该这样说;那么普通的旧grep就可以正常工作了。
您可以(乏味地)扩展regex以接受嵌套标记,这些标记不是<tr>,但当然,最好使用适当的HTML解析器,而不是花费大量时间重新发现正则表达式为什么不是正确的工具。
发布于 2013-10-01 20:25:25
.*?是一个Perl正则表达式。将grep更改为
grep -oP '<tr>.*?</tr>'https://stackoverflow.com/questions/19125173
复制相似问题