用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”function…
$ 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 }
请注意,只适用于小文件,因为它们将被读入内存。