使用SED修复HTML文档中的内部链接?

时间:2019-01-30 16:00:11

标签: bash sed grep

tl; dr:

经过四个小时的尝试,我距离开始时并不近。

我正试图在许多html文档的所有链接(没有其他扩展名)的末尾添加.html。有关我要执行的操作的示例,请参见下面的两个示例链接...

主要帖子:

我有大量的HTML文件,并且我试图“修复”链接,使其成为内部链接,以便它们都能很好地脱机工作。 (我这样做是为了让我姐姐可以在学习考试时离线使用该网站)。该站点不再在线。

我已经设法完成其中一些操作(使用简单的SED命令),但是我完全受不了。

我必须做的两个主要更改是:

  1. 在所有尚未扩展的链接的末尾添加 .html (有些链接已经具有.html,有些已经具有.js,.mp4或不需要更改的其他扩展)
  2. https:// 更改为 ../../../ (对于目录树中更深的文件,更多操作)

第二步将很容易(我将使用带有 maxdepth mindepth 的find来确定文件在目录树中的深度,然后是类似sed 's/https:\\/../../..//g'的东西),但是我之所以想这样做,是因为我猜测https将使查找需要.html添加到链接末尾的链接更加容易。

大多数链接都位于href标记中,但并非全部。

我想我将不得不使用某种SED正则表达式,并且由于必须以不同的方式处理不同的链接,因此可能需要多次运行SED。但是SED并不是我的专长。

两个示例链接...

  • 此链接:

pagespeed.addInstrumentationInit('/mod_pagespeed_beacon', 'beforeunload', '', 'https://www.example.com/learners/levels/2/lessons/13/stories/1','IF77dLwFOP',true,false,'ikd272iAGio');

需要更改为:

pagespeed.addInstrumentationInit('/mod_pagespeed_beacon', 'beforeunload', '', ../../../www.example.com/learners/levels/2/lessons/13/stories/1.html','IF77dLwFOP',true,false,'ikd272iAGio');

  • 这:

<a href="https://www.example.com/learners">Home</a> <ul>

必须是:

<a href="../../../www.example.com/learners.html">Home</a> <ul>

到目前为止我到哪里了

如上所述,我知道我将如何执行第二步,但是经过四个小时的尝试,我对第一步的了解还很远。 grep -Poh 'https://www.example[^"]*'显示URL列表,但我看不出它的用处。我只是不知道如何获得SED来将.html放在正确的位置。

任何提示将不胜感激!

1 个答案:

答案 0 :(得分:1)

GNU awk解决方案:

awk '{while(match($0, /["\x27]https?:\/\/([^\x27"]*)/, a))$0=substr($0,0,RSTART) "../../../" a[1] (a[1]~"\\.[[:alnum:]]{1,5}$"? "" : ".html") substr($0,RSTART+RLENGTH)}1'

放入单独的行:

awk '{
    while(match($0, /["\x27]https?:\/\/([^\x27"]*)/, a))  # while there are still url to replace
        $0=substr($0,0,RSTART) "../../../" a[1] (a[1]~"\\.[[:alnum:]]{1,5}$"? "" : ".html") substr($0,RSTART+RLENGTH) }
    1' file  # 1 for print $0

例如:

$ cat file
pagespeed.addInstrumentationInit('/mod_pagespeed_beacon', 'beforeunload', '', 'https://www.example.com/learners/levels/2/lessons/13/stories/1','IF77dLwFOP',true,false,'ikd272iAGio');
<a href="https://www.example.com/learners">Home</a>              <ul>
<a href="http://www2.example.com/learner2.html">Home</a>              <ul>
<a href="http://www3.example.com/learner3.html">Home</a><br><br><a href="https://www4.example.com/xhtml">Home</a>
whaeverwhatever

$ awk '{while(match($0, /["\x27]https?:\/\/([^\x27"]*)/, a))$0=substr($0,0,RSTART) "../../../" a[1] (a[1]~"\\.[[:alnum:]]{1,5}$"? "" : ".html") substr($0,RSTART+RLENGTH)}1' file
pagespeed.addInstrumentationInit('/mod_pagespeed_beacon', 'beforeunload', '', '../../../www.example.com/learners/levels/2/lessons/13/stories/1.html','IF77dLwFOP',true,false,'ikd272iAGio');
<a href="../../../www.example.com/learners.html">Home</a>              <ul>
<a href="../../../www2.example.com/learner2.html">Home</a>              <ul>
<a href="../../../www3.example.com/learner3.html">Home</a><br><br><a href="../../../www4.example.com/xhtml.html">Home</a>
whaeverwhatever