Использование SED для исправления внутренних ссылок в документах HTML? - PullRequest
0 голосов
/ 30 января 2019

tl; dr:

После четырех часов попыток я уже не ближе, чем был, когда начинал.

Я пытаюсь добавить .html в конец всех ссылок (у которых нет другого расширения) во многих HTML-документах.См. Два примера ссылок ... ниже для примера того, что я собираюсь сделать.

Основной пост:

У меня есть большая коллекция файлов HTML,и я пытаюсь «исправить» ссылки, сделать их внутренними ссылками, чтобы все работало в автономном режиме.(Я делаю это так, чтобы моя сестра могла пользоваться сайтом в автономном режиме во время подготовки к экзамену).Сайт больше не в сети.

Мне удалось выполнить некоторые из них (с помощью простой команды SED), но я полностью застрял с большинством.

Два основныхЯ должен внести следующие изменения:

  1. Добавление .html в конец всех ссылок , которые еще не имеют расширения (некоторые уже имеют.html, а некоторые имеют .js, .mp4 или другие расширения, которые не нужно менять)
  2. Изменение https:// на .. / .. / .. / (или больше для файлов глубже в дереве каталогов)

Второй шаг будет легким (я использую find с maxdepth mindepth , чтобы определить, насколько глубоко файл находится вдерево каталогов, а затем что-то вроде sed 's/https:\\/../../..//g'), однако я хочу сделать эту секунду, потому что я предполагаю, что https облегчит поиск ссылок, которые нужно .html добавить в конце).

Большинство ссылок в тегах href, но не во всех.

Я думаю, мне придется использовать какое-то регулярное выражение 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 голосов
/ 30 января 2019

Решение 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
...