更改现有文件的某些内容而不删除节点js中文件中的其他内容

Change some contents of an existing file without deleting the other contents in the file in node js

我的目标是改变

的颜色
.made-easy-theme{
            color:black
        }

在 css 文件中使用另一种颜色。但是当我使用 fs.writeFile 更改颜色时,它会删除 css 文件中的所有其他内容并仅替换

.made-easy-theme{
            color:black
        }

在更改颜色之前,css 文件包含以下内容,

@charset "utf-8";
        @import url(http://fonts.googleapis.com/css?family=Lato:300,400,700);
        @import url(http://weloveiconfonts.com/api/?family=entypo);
        /* entypo */
        [class*="entypo-"]:before {
          font-family: 'entypo', sans-serif;
        }
        .made-easy-theme{
            color:black
        }

        * {
          box-sizing: border-box;
        }

        .toggler {
          color: #A1A1A4;
          font-size: 1.25em;
          margin-left: 8px;
          text-align: center;
          cursor: pointer;
        }
        .toggler.active {
          color: #000;
        }

        .cardss {
          list-style: none;
          padding-right: 10px;
          padding-left: 10px;
          text-align: left;
          -webkit-overflow-scrolling: touch;
          max-width: 100%;
          -webkit-backface-visibility: hidden;
        }

但改变颜色后它只包含,

.made-easy-theme{color:hsl(0, 22%, 51%)}

hsl(0, 22%, 51%)(我从客户端收到的颜色)。 我的 js 文件包含更改 css 文件的代码,如下所示,

var main = 'temp/' + userId + '/templates/' + appId + '/css/main.css';
 var color = req.body.color;
function replaceThemecolor(color) {

        fs.readFile(main, 'utf-8',
            function (err, data) {
                var searchStr = ".made-easy-theme{color:black}";

                    console.log(searchStr);

                    var result = searchStr.replace(new RegExp('black', ''), color);
                    fs.writeFile(main, result, 'utf-8', function (err) {
                        console.log("kk");
                        console.log(color);
                        console.log(result);
                        if (err) return console.log(err);
                    });
            });

    }

我认为问题出在 fs.writeFile 方法上。我不知道如何获得正确的输出。

让我们看看这一行:

var result = searchStr.replace(new RegExp('black', ''), color);

它正在缩小 result 变量的范围,只在 searchStr 中替换模式 最初声明为:

var searchStr = ".made-easy-theme{color:black}";

所以在fs.writeFile中,result然后写入文件。

您当前的代码存在多个问题:

  1. 您正在读取文件内容,但未对其执行任何操作。您只是在静态字符串上进行替换,因此忽略了原始文件内容。

  2. 您的正则表达式仅查找与文件中任何位置匹配的黑色,但在您更改后将不匹配。

我想你想要这样的东西,使正则表达式只匹配该规则中的颜色。您可以根据需要使正则表达式尽可能复杂。我在这里展示的内容足够灵活,可以支持 .made-easy-theme 规则中的其他样式。它只会挑出 color 规则来改变。它假定颜色由名称指定,例如 "black".

var main = 'temp/' + userId + '/templates/' + appId + '/css/main.css';
var color = req.body.color;

function replaceThemecolor(color) {
    fs.readFile(main, 'utf-8', function (err, data) {
        var regex = /(\.made-easy-theme\s*{[^}]*color\s*:\s*)([^\n;}]+)([\s*;}])/;
        var result = data.replace(regex, "" + color + "");
        console.log(result);
        console.log(color);
        fs.writeFile(main, result, 'utf-8', function (err) {
            if (err) return console.log(err);
        });
    });
}

这是一个没有实际文件操作的文本块的工作演示:http://jsfiddle.net/jfriend00/e6923rqe/