0

我有一个使用wget. 我想将所有链接,即 all <a href=""> </a>,放在文件的末尾。可能吗?

例如,考虑以下文件:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /><a href="link.html">link</a>
    <br />Line3
    </td>
</tr>

我想把文字改成这样:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br />
    <br />Line3
    </td>
</tr>
<a href="link.html">link</a>
4

2 回答 2

2

对于示例数据中的简单锚标记,这个 Perl 脚本就足够了:

#!/usr/bin/env perl
use strict;
use warnings;

my @urls = ();

while (<>)
{
    chomp;
    if (m/\s*(<a\s+[^>]+>.*<\/a>)\s*/)
    {
        push @urls, $1;
        s///;
    }
    print "$_\n";
}

foreach my $url (@urls)
{
    print "$url\n";
}

示例输出:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br />
    <br />Line3
    </td>
</tr>
<a href="link.html">link</a>

请注意,如果输入中的单行上有多个锚标记,它还将包括脚本底部外部标记之间的材料。如果锚标记跨行断开,它将被忽略。我毫不怀疑有 HTML 符号可以破坏这个脚本(但我不确定它们是什么)。

这是简单脚本的一小步:

#!/usr/bin/env perl
use strict;
use warnings;

my @urls = ();

while (<>)
{
    chomp;
    while (m/\s*(<a\s+[^>]+>.*?<\/a>)\s*/)
    {
        push @urls, $1;
        s// /;
    }
    print "$_\n";
}

foreach my $url (@urls)
{
    print "$url\n";
}

while代替循环的循环if遍历一行中的匹配项。非贪婪.*?量词意味着它不会吞噬中间锚标签。替代品将删除的材料替换为空白,从而使分隔锚标签的单词保持分离。

示例数据:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /><a href="link.html">link</a>
    <br />Line3
    </td>
</tr>
<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /> <a href="link2.html">link</a> extraneous material <a href="link3.html">link</a> other notes <a href="link4.html">link</a>
    <br />Line3
    </td>
</tr>

示例输出:

<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /> 
    <br />Line3
    </td>
</tr>
<tr style="background-color: #EFEFEF">
    <td valign="top">Line1<br />2013.05.23</td>
    <td>Line2
    <br /> extraneous material other notes 
    <br />Line3
    </td>
</tr>
<a href="link.html">link</a>
<a href="link2.html">link</a>
<a href="link3.html">link</a>
<a href="link4.html">link</a>

您可以判断这是否足以满足您的目的。至少它给了你一些工作。

于 2013-05-12T20:42:20.970 回答
2

如果您只想复制(而不是移动)文件末尾的链接,您可以做一个简单的grep(当然可能不适用于特殊情况):

grep -o -P '(<a href=.*?</a>)' test.html > tmp.html && cat tmp.html >> test.html
于 2013-05-12T20:44:39.133 回答