【问题标题】:Need a modified behavior for non-greedy grep需要修改非贪婪 grep 的行为
【发布时间】:2011-11-17 09:44:35
【问题描述】:

我正在尝试清除大量注入客户博客的垃圾邮件。其中一个问题是,最初进行注入的黑客这样做的方式实际上是导致格式错误的多嵌入链接,因此我无法以简洁的方式获取它们。

我的想法是将帖子表中的所有链接转储到一个文本文件中,然后从该列表中删除有效链接,然后从那里创建一个 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>

虽然不是所有的链接都像这样被破坏,如果我清除上面命令的输出,我认为这将使追踪碎片变得非常困难。我认为我需要的是抓住整个街区的东西(即匹配打开&lt;a href与相同数量的关闭&lt;/a&gt;),或者只是可能的最小内部匹配(即从内到外的贪婪),我然后分多次进行,但我也愿意接受其他建议。对此有什么想法吗?谢谢!

【问题讨论】:

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


    【解决方案1】:

    我认为由内而外的方法是您最好的选择。假设&lt;a&gt; 元素内没有其他标签,应该就像将.*? 更改为[^&lt;&gt;]* 一样简单。而且,正如你所说,进行多次传球。

    虽然在许多正则表达式风格中可以一次匹配整个嵌套结构,但每种风格的做法都不同,而且总是很丑陋。

    【讨论】:

    • 谢谢。我最终将所有双嵌入链接转储到一个单独的文件中,手动清理它们,然后重新开始。花了一段时间,但没有我想象的那么糟糕。可以肯定的是,您的方法会更快。我会投票给你的答案,但我还没有足够的代表。
    猜你喜欢
    • 2020-03-26
    • 2011-03-02
    • 2015-01-03
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多