【问题标题】:How to match in bash specific hash in source file and replace by it match in target file?如何匹配源文件中的bash特定哈希并替换为目标文件中的匹配?
【发布时间】:2021-01-05 05:39:12
【问题描述】:

我想将 md5 哈希从 source.html 复制到另一个 docker 映像中的另一个静态文件以启用浏览器缓存,特别是如何在 bash 中将 /app.css 替换为 /app-67131f3c5c4e7877d424.css/app.js 替换为 /app-67131f3c5c4e7877d424.js脚本是否整洁?

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,但这种方法会禁用浏览器缓存。

【问题讨论】:

  • 你为这个任务做了什么?
  • 我只是将带有摘要的文件复制到没有它的位置,因为使用 sed 我不知道如何将动态匹配重定向到适当位置的目标文件
  • 你必须使用 html,xml 解析器来完成这项工作,也许你标记 bash、sed 或其他文本操作工具的 xmlstartlet 在特殊情况下可能会失败。

标签: html bash file 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 个小写十六进制字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    相关资源
    最近更新 更多