使用sed删除所有<a href="https://github.com/mikel/mail#sending-an-email" rel="nofollow">documentation</a> <p> <a name="foo">

时间:2016-01-11 23:58:51

标签: regex sed

I have multiple html documents and each one has many occurrences of

<a name="pIDsomestring"> 

where 'somestring' varies with each occurrence.

I want to delete the entire tag, as well as the

</a> 

closing HTML tag that immediately follows it, but importantly, not the text inside the anchor tag.

Is there an easy way to do this with sed?

1 个答案:

答案 0 :(得分:1)

HTML比使用sed解析的要复杂得多。两个HTML可以绝对等效,但就sed命令而言看起来完全不同。例如,你不能真正编写一个sed命令来识别这两个是等价的:

<a name="foo">bar</a>

<A
    NAME = "foo"
    ><!-- </A> --bar</>-- -->

</>,如果您想知道,在这种情况下意味着</a>。而且,即使是Stack Overflow的语法高亮显示也会被<!-- comment -- not-a-comment -- comment -->符号弄糊涂。)

上面是一个病态的例子,当然,即使完全普通的现实世界的HTML经常在随机的地方有换行符和其他空格,这些空格对HTML没有影响但对sed命令有很大的影响

但是,如果你只是做一次性的任务,你可以在之后手动验证结果,你可以尝试这样的事情:

's#<a name="[^"]*">\(\([^<]\|<[^/]\|</[^a]\|</a[^>]\)*\)</a>#\1#g'

只要整个事情都在一条线上,它通常会起作用。