Regex 使用非贪婪匹配?和格雷普
我正在编写一个bash脚本,它分析一个html文件并 我想获得每一张Regex 使用非贪婪匹配?和格雷普,regex,bash,grep,Regex,Bash,Grep,我正在编写一个bash脚本,它分析一个html文件并 我想获得每一张…的内容。所以我的命令看起来像: $ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>' 如何使*非贪婪?如果您有GNU Grep您可以使用-p使匹配非贪婪: $ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>' 如果您没有GNU grep,并且HTML格式良好,
…
的内容。所以我的命令看起来像:
$ tr -d \\012 < price.html | grep -oE '<tr>.*?</tr>'
如何使
*
非贪婪?如果您有GNU Grep
您可以使用-p
使匹配非贪婪:
$ tr -d \\012 < price.html | grep -Po '<tr>.*?</tr>'
如果您没有
GNU grep
,并且HTML格式良好,您可以执行以下操作:
$ tr -d \\012 < price.html | grep -o '<tr>[^<]*</tr>'
$tr-d\\012*?
是一个Perl正则表达式。请将grep
更改为
grep -oP '<tr>.*?</tr>'
grep-oP.*?'
试试perl风格的regexp
$ grep -Po '<tr>.*?</tr>' input
<tr>stuff</tr>
<tr>more stuff</tr>
$grep-Po.*?”输入
东西
更多的东西
非贪婪匹配不是grep-E
支持的扩展正则表达式语法的一部分。如果有,请使用grep-p
,或者切换到Perl/Python/Ruby/what have.(哦,pcregrep
)
当然,如果你真的是说
<tr>[^<>]*</tr>
[^]*
您应该这样说;然后普通的oldgrep
就可以了
您可以(繁琐地)扩展正则表达式以接受不是
的嵌套标记,但当然,最好使用适当的HTML解析器,而不是花费大量时间重新发现为什么正则表达式不是合适的工具。或者,如果他只想要tr标记的内容:grep-oP'(?最后一个示例(使用)[^@glennjackman好的一点,我将在回答中留下它,但是一般原则可能对旁观者有用。义务:
$ grep -Po '<tr>.*?</tr>' input
<tr>stuff</tr>
<tr>more stuff</tr>
<tr>[^<>]*</tr>