1

我正在开发一个网站的前端代码,我将把它交给一些开发人员,让他们将其与后端集成。该站点将使用 .NET 编写,但我正在使用静态 HTML 文件(以及一些 javascript)开发前端代码。

因为我在开发环境中使用服务器端包含的所有页面的页眉、页脚和一些其他元素都是相同的。但是,每次我将代码交给开发人员时,我都需要通过复制和粘贴手动将每个 SSI 替换为实际的 HTML。这开始变得乏味了。

我曾尝试编写一个 bash 脚本来执行此操作,但我的 bash 知识非常有限,所以我失败得很惨(我不确定从哪里开始)。

我试图实现的是:

  • 循环遍历我项目中的所有 HTML 文件
  • 查找包含 ( <!--#include file="myfile.html"-->)
  • 如果找到,则将包含替换为包含中指定的文件中的 HTML
  • 继续这样做,直到没有更多的包含,然后继续下一个文件

有谁知道可以做到这一点的脚本,或者可以指出我自己实现这一目标的正确方向?只要我可以在我的 Mac 上运行它,我很高兴它可以使用任何语言。

谢谢。

编辑

可以安全地假设 的所有实例<!--#include file="myfile.html"-->都在自己的行上。

4

2 回答 2

1

该规范并未涵盖所有细节,因此我有以下假设。

  1. <!--#include file="myfile.html"-->条线保持自己的状态。其他字符被删除。
  2. 包含的文件不包含其他包含。
  3. 在项目目录中,无需检查子目录。

在这种情况下,这样的事情可以完成这项工作。它在中:

#!/usr/bin/bash

search=${1:-./}

replace() {
  while read -r x; do
    if [[ "$x" =~ \<!--#include\ file=\"([^\.]+.html)\"--\> ]]; then
      cat "${BASH_REMATCH[1]}";
    else
      echo "$x"
    fi
  done <"$1"
}

while read f; do
  replace "$f" > tmp_$$.tmp && mv tmp_$$.tmp "$f"
done < <(find $search  -maxdepth 1 -name '*.html')

它读取*.html指定目录中的所有文件(不是递归的)。如果没有给定参数,则检查当前目录。对于它调用replace函数的每一行。Replace搜索包含行。如果找到,则将文件内容打印到标准输出,否则显示原始行。

让我们考虑文件:

cat >master.html <<XXX
<html>
<!--#include file="myfile.html"-->
</html>
XXX

cat >myfile.html <<XXX
<title>
My file
</title>
XXX

结果:

$ cat master.html
<html>
<title>
My file
</title>
</html>
$ cat myfile.html
<title>
My file
</title>

我希望这可以帮助...

于 2013-08-22T13:02:56.007 回答
0

在您的开发机器上,使用您的浏览器显示网页,然后使用适当的文件名/在输出目录中保存“结果”。

因此,如果您有执行各种 time/last-mod 指令的 mainfile.html,并且在适当的位置包含 fileA.inc 和 fileB.inc,则生成的显示(和可保存的 HTML 文件)将包含所有四个/五个组件。

=dn

于 2014-03-16T02:29:36.303 回答