所以我尝试使用sed (在这些系统上它必须是sed的,所以请不要只推荐使用Perl)来匹配HTML标记并从中获取内容。HTML标记看起来像这样:
<div class="SectionText"> Received poor service or think your current mechanic is ripping you off? Get some help from <a href="http://www.union.umd.edu/gradlegalaid/index.htm" target="_blank">Graduate Legal Aid</a> or consult the <a href="http://www.oag.state.md.us/Consumer/index.htm" target="_blank">Maryland Attorney General Office of Consumer Protection</a> at <a href="mailto:consumer@oag.state.md.us">consumer@oag.state.md.us</a> or through their hotline at 410-528-8662 or 888-743-0023.<br /></div>这一切都在一条线上。所以,我写了这个...但它不起作用。
sed 's/<div class=\"SectionText\">\([^<\/div>]*\)<\/div>/\1/g'这不会改变任何文本。
我试着使用这个网站作为一个指南- http://www.ibm.com/developerworks/linux/library/l-sed2/index.html (在RegExp混乱之下)\
最重要的是,这行脚本不要贪婪,要匹配到最后一行
发布于 2012-03-17 05:01:15
[^<\/div>]*这并不是你所想的那样。它匹配不是<、/、d、i、v或>的任何字符序列。
在Perl中,您可以简单地使用.*?,但由于sed不支持非贪婪匹配,因此您必须编写类似下面这样的代码:
sed 's#<div class="SectionText">\(\([^<]\|<[^/]\|</[^d]\|</d[^i]\|</di[^v]\|</div[^>]\)*\)</div>#\1#g'这表示“任何字符序列不是<,或者是<而不是/,或者是</而不是d,依此类推。
不用说,这是一个不可读、不可维护、几乎不可写的垃圾,您几乎肯定不应该使用它,但是如果您绝对、肯定地必须使用正则表达式来解析HTML,并且绝对、肯定地必须使用sed,那么就可以使用它了。
发布于 2012-03-17 04:48:07
除了尝试在html上使用正则表达式(参见RegEx match open tags except XHTML self-contained tags)之外,我看到的第一个问题是:
[^<\/div>]*
这意味着匹配任何不是<、/、d、i、v或>的字符。很明显,你有一个d和一个i。("Rece i ve d poor Server....“)
如果您打算使用正则表达式来执行此操作,并且您有一个控制/可预测的输入,那么您可以简单地执行[^<>],假设您的文本中不包含这些字符。但是,我知道你有,因为你在你的div里面有标签…
但是,如果您这样做:
sed 's/<div.class="SectionText">\(.*\)<\/div>/\1/g'
只要你没有多个</div>,它就应该可以工作。.*只有在找到<\/div>之前才会匹配。
https://stackoverflow.com/questions/9744246
复制相似问题