내가 사용하는 MD5의 툴툴 거리는 소리 작업을 MD5 파일 이름을 생성 할 수 있습니다. 이제 작업 콜백에서 HTML 파일의 소스 이름을 새 파일 이름으로 바꾸고 싶습니다. 가장 쉬운 방법이 무엇인지 궁금합니다.
답변
간단한 정규식을 사용할 수 있습니다.
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 패키지 파일 바꾸기를 만들었습니다 . @asgoth의 답변을 부분적으로 기반으로합니다.
편집 (2016 년 10 월 3 일) : 패키지는 이제 약속 및 글로브를 지원하며 사용 지침이 업데이트되었습니다.
편집 (2018 년 3 월 16 일) :이 패키지는 현재 월간 다운로드 수가 100,000 회가 넘으며 CLI 도구뿐만 아니라 추가 기능으로 확장되었습니다.
설치:
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);
}
답변
아마도 “교체”모듈 ( 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);
더 많은 예제를 보려면 ShellJs.org 를 방문하십시오 .
답변
스트림을 사용하여 읽는 동안 파일을 처리 할 수 있습니다. 버퍼를 사용하는 것과 같지만 더 편리한 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');
답변
작은 자리 표시자를 큰 코드 문자열로 바꿀 때 문제가 발생했습니다.
나는하고 있었다:
var replaced = original.replace('PLACEHOLDER', largeStringVar);
문제가 여기 에 설명 된 JavaScript의 특수 대체 패턴이라는 것을 알았 습니다 . 교체 문자열로 사용했던 코드에 일부 코드 $
가 포함되어 있으므로 출력이 엉망이되었습니다.
내 솔루션은 특수 교체를 수행하지 않는 함수 교체 옵션을 사용하는 것이 었습니다.
var replaced = original.replace('PLACEHOLDER', function() {
return largeStringVar;
});
답변
원자 교체를위한 임시 쓰기 파일이있는 Node 7.6+ 용 ES2017 / 8.
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
}
작은 파일은 메모리로 읽히므로 작습니다.