用nodejsreplace文件中的string

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

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

var result = fileAsString.replace(/string to be replaced/g, 'replacement'); 

所以…

 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); }); }); 

也许“replace”模块( http://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, }); 

由于replace不工作,我创build了一个简单的npm包replace文件,以快速replace一个或多个文件中的文本。 这部分是基于@ asgoth的回答。

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

安装:

 npm install replace-in-file 

需要模块

 const replace = require('replace-in-file'); 

指定replace选项

 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) replace: /Find me/g, with: 'Replacement', }; 

具有承诺的asynchronousreplace:

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

带callback的asynchronousreplace:

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

同步replace:

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

你也可以使用ShellJS中的'sed'函数…

  $ npm install [-g] shelljs require('shelljs/global'); sed('-i', 'search_pattern', 'replace_pattern', file); 

有关更多示例,请访问ShellJs.org 。

您可以在使用stream读取文件的同时处理文件。 这就像使用缓冲区,但有一个更方便的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'); 

我用一大串代码replace一个小占位符时遇到了问题。

我在做:

 var replaced = original.replace('PLACEHOLDER', largeStringVar); 

我发现问题是JavaScript的特殊replace模式, 在这里描述。 由于我使用的替代string的代码有一些$ ,它搞乱了输出。

我的解决scheme是使用functionreplace选项,它不会做任何特殊的replace:

 var replaced = original.replace('PLACEHOLDER', function() { return largeStringVar; }); 

我会使用一个双工stream代替。 就像这里记载的nodejs doc双工stream一样

一个变换stream是一个双工stream,输出是以某种方式从input中计算出来的。

用于节点7.6+的ES2017 / 8具有用于primefacesreplace的临时写入文件。

 const Promise = require('bluebird') const fs = Promise.promisifyAll(require('fs')) async function replaceRegexInFile(file, search, replace){ let contents = await fs.readFileAsync(file, 'utf8') let replaced_contents = contents.replace(search, replace) let tmpfile = `${file}.jstmpreplace` await fs.writeFileAsync(tmpfile, replaced_contents, 'utf8') await fs.renameAsync(tmpfile, file) return true } 

请注意,只适用于小文件,因为它们将被读入内存。