我使用md5 grunt task生成MD5文件名。現在我想用任務回調中的新文件名重命名html文件中的源文件。我不知道最簡單的方法是什麼。使用nodejs替換文件中的字符串
回答
你可以使用簡單的regex:
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);
});
});
您也可以使用 'sed的' 功能是ShellJS的一部分......
$ npm install [-g] shelljs
require('shelljs/global');
sed('-i', 'search_pattern', 'replace_pattern', file);
更多示例請訪問ShellJs.org。
也許「替換」模塊(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,
});
你知道如何通過文件擴展名來篩選路徑嗎?如路徑:['path/to/your/file/*。js'] - >它不起作用 – Kalamarico
您可以使用node-glob將glob模式展開爲一組路徑,然後迭代它們。 – RobW
這很好,但已被放棄。如果需要開箱即用的解決方案,請參閱http://stackoverflow.com/a/31040890/1825390以獲取維護的軟件包。 – xavdid
由於更換所不是爲我工作,我創建了一個簡單的NPM包replace-in-file在一個或多個文件快速替換文本。這部分基於@ asgoth的答案。
編輯(2016年10月3日):該軟件包現在支持promise和globs,並且使用說明已更新以反映此情況。
安裝:
npm install replace-in-file
要求模塊
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',
};
異步置換承諾:
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);
}
,同時通過使用流讀取你可以處理文件。這就像使用緩衝區,但更方便的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');
我會使用雙工流代替。像這裏nodejs doc duplex streams
記錄的變換流,其中輸出被計算在 從輸入某種方式雙工流。
我用一大串代碼替換小佔位符時遇到了問題。
我做:
var replaced = original.replace('PLACEHOLDER', largeStringVar);
我想通了,問題是JavaScript的特殊替換模式,描述here。由於我用作代替字符串的代碼中有一些$
,所以它搞亂了輸出。
我的解決辦法是使用功能替換選項,它沒有做任何特殊的更換:
var replaced = original.replace('PLACEHOLDER', function() {
return largeStringVar;
});
ES2017/8節點7.6+與原子替換臨時寫文件。
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
}
請注意,只適用於小文件,因爲它們將被讀入內存。
不需要'bluebird',使用原生'Promise'和[util.promisify](https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original)。 –
@FranciscoMateo真,但超越1或2功能promisifyAll仍然超級有用。 – Matt
- 1. 如何使用NodeJS替換PDF文件中的字符串?
- 2. 用str_ireplace代替文件中的字符串替換字符串
- 3. 用xml文件中的空字符串替換字符串
- 4. 用新字符串替換文件中的字符串
- 5. 如何用文件中的字符串替換字符串中的字符串
- 6. PERL:文件中的字符串替換
- 7. 替換gzip文件中的字符串
- 8. 替換文件中的字符串
- 9. 替換XML文件中的字符串
- 10. 替換文件中的字符串
- 11. 替換文件中的字符串Unix
- 12. Shell替換文件中的字符串
- 13. 如何使用robotframework替換文件中的文本/字符串
- 14. 如何使用java替換文本文件中的字符串?
- 15. 使用PowerShell替換文本文件中的字符串
- 16. 用字符串替換文件行
- 17. 第一替換文件中的字符串的使用sed的
- 18. 使用STUFF替換SQL中的字符串,並使用小於要替換的字符串的字符串
- 19. 用文本文件中的字符串替換數字
- 20. 使用替換字符串中的ASP
- 21. 使用sed替換文件中的字符串
- 22. 使用Python替換文件中的字符串
- 23. 需要使用puppet替換文件中的字符串
- 24. 使用groovy替換文件中的字符串
- 25. 使用PHP和HTML替換文件中的字符串
- 26. 使用str_replace替換外部文件中的字符串值
- 27. 使用sed替換多個文件中的字符串
- 28. 替換文件內聯字符串中使用的sed
- 29. 使用shell腳本替換配置文件中的字符串
- 30. 使用VBS替換文件中的字符串並批處理
當然,但我必須閱讀文件替換文本,然後再次寫入文件,或者有一種更簡單的方法,抱歉,我更像是一個前端人。 –
也許有一個節點模塊來實現這一點,但我不知道它。添加了一個完整的示例btw。 – asgoth
小錯誤,在第6行'someFile'替換爲'data' – Zax