#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 строчных шестнадцатеричных символов.