首页 > 解决方案 > 创建脚本以在较大文件的占位符中替换小文件的内容

问题描述

我正在尝试创建一个脚本,它将文本文件中的多行文本插入到我的 index.html 中。

这就是我的想法。创建一个名为testEnvConfig.json.内容的文件将包含我的测试 Firebase 服务器的设置。

var config = {
    apiKey: "AIzaSyALdWxUxt63AwOrj-waTNvZo7_zt8CuMgs",
    databaseURL: "https://bggoplantestdev.firebaseio.com",
    projectId: "bggoplantestdev",
    storageBucket: "bggoplantestdev.appspot.com",
    messagingSenderId: "499035393973"
};

我还有一个非常大的 html 文件index.html,其中包含超过 1000 行代码。但是,调用中只有一个变量$config

我只是想运行一个脚本./configureEnv <env>,它将测试文件作为参数并将 $config 变量替换为测试文件的内容。

所以最终的结果是这样的:

* 之前*(在 index.html 中)

try {
  var $config
  var fbapp = firebase.initializeApp(config);

之后(在 index.html 中)

try {
  var config = {
    apiKey: "AIzaSyALdWxUxt63AwOrj-waTNvZo7_zt8CuMgs",
    databaseURL: "https://bggoplantestdev.firebaseio.com",
    projectId: "bggoplantestdev",
    storageBucket: "bggoplantestdev.appspot.com",
    messagingSenderId: "499035393973"
  };
  var fbapp = firebase.initializeApp(config);

关于如何做到这一点的任何建议?

标签: bashshellscripting

解决方案


将文件内容读入变量。然后使用 here-doc 作为模板,并在您想要的位置替换变量。

#!/bin/bash
filename=$1
config=$(< "$filename")
cat <<EOF >index.html
try {
  $config 
  // this $config variable would be substituted by the 
  // value of env in the script.
  var fbapp = firebase.initializeApp(config);
} catch {
  // do something
}
EOF

脚本的参数是包含配置的文件的名称。

其实,我建议你把var config =配置文件拿出来,把结构放进去。变量的名称应该只是在模板中。然后脚本将如下所示:

#!/bin/bash
filename=$1
config=$(< "$filename")
cat <<EOF > index.html
try {
  var config = $config;
  // this $config variable would be substituted by the 
  // value of env in the script.
  var fbapp = firebase.initializeApp(config);
} catch {
  // do something
}
EOF

推荐阅读