我使用md5 grunt 任务来生成 MD5 文件名。现在我想在任务的回调中使用新文件名重命名 HTML 文件中的源。我想知道什么是最简单的方法来做到这一点。
用 nodejs 替换文件中的字符串
IT技术
javascript
node.js
replace
gruntjs
2021-01-24 20:53:39
6个回答
您可以使用简单的正则表达式:
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 对我不起作用,我创建了一个简单的 npm 包replace-in-file来快速替换一个或多个文件中的文本。它部分基于@asgoth 的回答。
编辑(2016 年 10 月 3 日):该包现在支持 promises 和 globs,并且使用说明已更新以反映这一点。
编辑(2018 年 3 月 16 日):该软件包现在每月下载量已超过 10 万次,并且已扩展了附加功能以及 CLI 工具。
安装:
npm install replace-in-file
需要module
const replace = require('replace-in-file');
指定替换选项
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',
};
异步替换Promise:
replace(options)
.then(changedFiles => {
console.log('Modified files:', changedFiles.join(', '));
})
.catch(error => {
console.error('Error occurred:', error);
});
用回调异步替换:
replace(options, (error, changedFiles) => {
if (error) {
return console.error('Error occurred:', error);
}
console.log('Modified files:', changedFiles.join(', '));
});
同步替换:
try {
let changedFiles = replace.sync(options);
console.log('Modified files:', changedFiles.join(', '));
}
catch (error) {
console.error('Error occurred:', error);
}
也许“替换”module(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,
});
您还可以使用 ShellJS 中的“sed”函数...
$ npm install [-g] shelljs
require('shelljs/global');
sed('-i', 'search_pattern', 'replace_pattern', file);
完整的文档...
您可以在使用流读取的同时处理文件。这就像使用缓冲区,但具有更方便的 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');