需要针对非贪婪grep的修改行为

时间:2011-09-14 21:35:04

标签: regex sed grep regex-greedy non-greedy

我正在尝试清除大量注入客户博客的垃圾邮件。其中一个问题是,最初进行注入的黑客实际上是以错误的多嵌入链接结束,所以我很难以简洁的方式抓住它们。

我的想法是将posts表中的所有链接转储到文本文件中,然后从该列表中删除有效链接,然后从那里创建一个bash脚本,一次删除一行中的恶意脚本。我试图使用非贪婪的grep来转储链接,否则如果帖子中有多个链接,它将从第一个链接的开头到最后一个链接的结尾。这是我正在使用的那条线:

grep -Po "<a href=[\'\"][^\'\"]*[\'\"]>.*?</a>" wp_posts.sql>full-link-list.txt

当它试图解析嵌入在其他链接中的链接时,问题就出现了。例如,我明白了:

<a href="http://blogtorn.com/images/">where <a href="http://clinesite.com/images/">buy n viagra </a>

来自这样的部分:

<a href="http://blogtorn.com/images/">where <a href="http://clinesite.com/images/">buy n viagra </a>  do you buy viagra | buy cialis phentermine | cheap levitra online</a>

虽然并非所有链接都像这样被打破,如果我清除上面命令中的那些输出,我认为这将很难追踪碎片。我认为我需要的是抓住整个块的东西(即匹配开口<a href与相同数量的闭合</a>),或者只是最小的内部匹配(即从内部贪婪)然后我在多次通过中做到这一点,但我也对其他建议持开放态度。有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我认为从内到外的方法是你最好的选择。假设<a>元素中没有其他标记,则应该像将.*?更改为[^<>]*一样简单。而且,正如你所说,多次通过。

虽然在许多正则表达式中可以在一次传递中匹配整个嵌套结构,但每种味道都有不同的含义,并且它总是很难看。