用nodejs替换文件中的字符串

And*_*rle 136 javascript replace node.js gruntjs

我使用md5 grunt任务生成MD5文件名.现在我想在任务的回调中使用新文件名重命名HTML文件中的源.我想知道最简单的方法是什么.

asg*_*oth 258

你可以使用简单的正则表达式:

var result = fileAsString.replace(/string to be replaced/g, 'replacement');
Run Code Online (Sandbox Code Playgroud)

所以...

var fs = require('fs')
fs.readFile(someFile, 'utf8', function (err,data) {
  if (err) {
    return console.log(err);
  }
  var result = data.replace(/string to be replaced/g, 'replacement');

  fs.writeFile(someFile, result, 'utf8', function (err) {
     if (err) return console.log(err);
  });
});
Run Code Online (Sandbox Code Playgroud)

  • 小错误,在第6行'someFile'替换为'data' (5认同)
  • @Zax:谢谢,我很惊讶这个'虫'可以存活这么久;) (4认同)
  • 当然可以,但是我是否必须读取文件替换文本然后再次写入文件,或者是否有更简单的方法,抱歉我更像是前端人员。 (3认同)

Ada*_*eis 62

由于替换不适合我,我已经创建了一个简单的npm包替换文件,以快速替换一个或多个文件中的文本.它部分基于@ asgoth的答案.

编辑(2016年10月3日):该软件包现在支持promises和globs,并且使用说明已更新以反映这一点.

编辑(2018年3月16日):该软件包现已每月下载超过10万次,并且已经扩展了其他功能以及CLI工具.

安装:

npm install replace-in-file
Run Code Online (Sandbox Code Playgroud)

需要模块

const replace = require('replace-in-file');
Run Code Online (Sandbox Code Playgroud)

指定替换选项

const options = {

  //Single file
  files: 'path/to/file',

  //Multiple files
  files: [
    'path/to/file',
    'path/to/other/file',
  ],

  //Glob(s) 
  files: [
    'path/to/files/*.html',
    'another/**/*.path',
  ],

  //Replacement to make (string or regex) 
  from: /Find me/g,
  to: 'Replacement',
};
Run Code Online (Sandbox Code Playgroud)

使用promise进行异步替换:

replace(options)
  .then(changedFiles => {
    console.log('Modified files:', changedFiles.join(', '));
  })
  .catch(error => {
    console.error('Error occurred:', error);
  });
Run Code Online (Sandbox Code Playgroud)

使用回调进行异步替换:

replace(options, (error, changedFiles) => {
  if (error) {
    return console.error('Error occurred:', error);
  }
  console.log('Modified files:', changedFiles.join(', '));
});
Run Code Online (Sandbox Code Playgroud)

同步更换:

try {
  let changedFiles = replace.sync(options);
  console.log('Modified files:', changedFiles.join(', '));
}
catch (error) {
  console.error('Error occurred:', error);
}
Run Code Online (Sandbox Code Playgroud)

  • 优秀且易于使用的交钥匙模块.与async/await和一个相当大的文件夹上的glob一起使用,它很快就闪电了 (3认同)
  • 很好,在我读到这个答案之前,我发现并使用了这个包(用于它的 CLI 工具)。爱它 (2认同)

Sla*_*tow 32

也许"替换"模块(www.npmjs.org/package/replace)也适合你.它不需要您阅读然后写入文件.

改编自文档:

// install:

npm install replace 

// require:

var replace = require("replace");

// use:

replace({
    regex: "string to be replaced",
    replacement: "replacement string",
    paths: ['path/to/your/file'],
    recursive: true,
    silent: true,
});
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但已被放弃.如果您想要一个开箱即用的解决方案,请参阅http://stackoverflow.com/a/31040890/1825390以获取维护包. (3认同)

Ton*_*gan 25

你也可以使用属于ShellJS的'sed'函数......

 $ npm install [-g] shelljs


 require('shelljs/global');
 sed('-i', 'search_pattern', 'replace_pattern', file);
Run Code Online (Sandbox Code Playgroud)

访问ShellJs.org了解更多示例.

  • 这不会做多行。 (2认同)

Sri*_*tha 12

如果有人想使用基于 Promise 的“fs”模块来完成任务。

const fs = require('fs').promises;

// Below statements must be wrapped inside the 'async' function:
const data = await fs.readFile(someFile, 'utf8');
const result = data.replace(/string to be replaced/g, 'replacement');
await fs.writeFile(someFile, result,'utf8');
Run Code Online (Sandbox Code Playgroud)


san*_*bor 5

您可以在使用流读取时处理该文件.这就像使用缓冲区但使用更方便的API.

var fs = require('fs');
function searchReplaceFile(regexpFind, replace, cssFileName) {
    var file = fs.createReadStream(cssFileName, 'utf8');
    var newCss = '';

    file.on('data', function (chunk) {
        newCss += chunk.toString().replace(regexpFind, replace);
    });

    file.on('end', function () {
        fs.writeFile(cssFileName, newCss, function(err) {
            if (err) {
                return console.log(err);
            } else {
                console.log('Updated!');
            }
    });
});

searchReplaceFile(/foo/g, 'bar', 'file.txt');
Run Code Online (Sandbox Code Playgroud)

  • 但是......如果chunk拆分regexpFind字符串怎么办?意图不是失败吗? (3认同)