Как сопоставить определенный хэш в bash в исходном файле и заменить его совпадением в целевом файле?

#html #bash #file #sed

#HTML #bash #файл #sed

Вопрос:

Я хотел бы скопировать хэш md5 из source.html другого моего статического файла в другой образ docker, чтобы включить кэширование браузера, в частности, как я могу /app.css /app-67131f3c5c4e7877d424.css аккуратно и аккуратно заменить by и /app.js by /app-67131f3c5c4e7877d424.js в скрипте bash?

source.html

 <!doctype html>
<html lang="en">
  <head>
    <link href="app-67131f3c5c4e7877d424.css" rel="stylesheet">
  </head>
  <body>
    <script type="text/javascript" src="app-67131f3c5c4e7877d424.js"></script>
  </body>
</html>
  

existing_file_as_target.html

 <!doctype html>
<html lang="en">
  <head>
    <link href="/app.css" rel="stylesheet">
  </head>
  <body>
    <script type="text/javascript" src="/app.js"></script>
  </body>
</html>
  

Обратите внимание, что это упрощенная версия, и у меня много тегов скрипта и т. Д.

На данный момент я просто копирую app-67131f3c5c4e7877d424.css app.css , но этот подход отключает кеш браузера.

Комментарии:

1. Что вы пробовали для этой задачи?

2. Я просто копирую файл с дайджестом без него, потому что с помощью sed я не знаю, как перенаправить динамическое совпадение в целевой файл в нужном месте

3. для этой работы вам нужно использовать html, xml parser, возможно, xmlstartlet, поскольку вы отметили bash, sed или другие инструменты для обработки текста, могут не работать в особых случаях.

Ответ №1:

Сделайте это с помощью Perl, а не с sed :

    $ digest=`perl -ne 's{src="app-([0-9a-f]{20}.js")}{print $1}e' source.html`
   $ perl -npe "s{src="/app.js"}{src="/app-$digest.js"}" existing_file_as_target.html >new.html
  

Файл new.html содержит то, что вам нужно.

Примечание: в вашем source.html URL-адресе app-DIGEST.js не было косой черты. У existing_file_as_target.html вас была /app.js косая черта. Мое решение учитывает это. Если это предположение неверно, вставьте или удалите косую черту по мере необходимости.

Решение также предполагает, что дайджест всегда состоит ровно из 20 строчных шестнадцатеричных символов.