我需要一个脚本来搜索文件以寻找SSI并用实际的HTML替换include

时间:2013-08-22 10:11:44

标签: python html ruby bash ssi

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

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

我尝试过写一个bash脚本来做这个但是我的bash知识非常有限,所以我失败了(我不确定从哪里开始)。

我试图实现的是:

  • 遍历项目中的所有HTML文件
  • 寻找包含(<!--#include file="myfile.html"-->
  • 如果找到一个,请将include替换为include
  • 中指定的文件中的HTML
  • 继续这样做,直到不再包含并转到下一个文件

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

感谢。

修改

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

2 个答案:

答案 0 :(得分:1)

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

  1. <!--#include file="myfile.html"-->行保持不变。其他字符将被删除。
  2. 包含的文件不包含其他包含。
  3. 在项目目录中,不必检查子目录。
  4. 在这种情况下,这样的事情可以完成这项工作。它位于

    #!/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文件(不递归)。如果没有给出args则检查当前目录。对于每一行,它调用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>
    

    我希望这可以帮助......

答案 1 :(得分:0)

在您的开发计算机上,使用浏览器显示网页,然后保存结果&#39;在输出目录中使用适当的文件名。

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

= DN