আমি এমডি 5 ফাইলের নাম তৈরি করতে এমডি 5 গ্রান্ট টাস্কটি ব্যবহার করি । এখন আমি এইচটিএমএল ফাইলের উত্সগুলির নতুন নামটি কার্যের কলব্যাকের সাথে নতুন নামকরণ করতে চাই। আমি আশ্চর্য হলাম এটি করার সবচেয়ে সহজ উপায় কী।
আমি এমডি 5 ফাইলের নাম তৈরি করতে এমডি 5 গ্রান্ট টাস্কটি ব্যবহার করি । এখন আমি এইচটিএমএল ফাইলের উত্সগুলির নতুন নামটি কার্যের কলব্যাকের সাথে নতুন নামকরণ করতে চাই। আমি আশ্চর্য হলাম এটি করার সবচেয়ে সহজ উপায় কী।
উত্তর:
আপনি সাধারণ রেজেক্স ব্যবহার করতে পারেন:
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);
});
});
যেহেতু প্রতিস্থাপনটি আমার পক্ষে কাজ করে না, তাই আমি একটি সহজ এনপিএম প্যাকেজটি ইন-ফাইল-প্রতিস্থাপন করেছি এক বা একাধিক ফাইলে টেক্সটটি দ্রুত প্রতিস্থাপনের জন্য । এটি আংশিক @ অ্যাসগোথের উত্তরের ভিত্তিতে।
সম্পাদনা (3 অক্টোবর 2016) : প্যাকেজটি এখন প্রতিশ্রুতি এবং গ্লোবগুলিকে সমর্থন করে এবং এটি প্রতিফলিত করতে ব্যবহারের নির্দেশাবলী আপডেট করা হয়েছে।
সম্পাদনা (16 মার্চ 2018) : প্যাকেজটি এখন 100k এরও বেশি মাসিক ডাউনলোড সংগ্রহ করেছে এবং অতিরিক্ত বৈশিষ্ট্য পাশাপাশি একটি সিএমআই সরঞ্জাম দিয়ে প্রসারিত হয়েছে।
ইনস্টল করুন:
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,
});
readFile()
এবং writeFile()
মাত্র গৃহীত উত্তর চাই।
আপনি শেলজেএস-এর অংশ যা 'সেড' ফাংশন ব্যবহার করতে পারেন ...
$ npm install [-g] shelljs
require('shelljs/global');
sed('-i', 'search_pattern', 'replace_pattern', file);
আরও উদাহরণের জন্য ShellJs.org দেখুন .org
shx
আপনাকে এনএমপি স্ক্রিপ্টগুলি থেকে চালাতে দেয়, শেলজেএসআর.আর্গ.আর্গ. এটি প্রস্তাবিত। github.com/shelljs/shx
আপনি স্ট্রিম ব্যবহার করে পড়ার সময় ফাইলটি প্রক্রিয়া করতে পারেন। এটি ঠিক বাফার ব্যবহারের মতো তবে আরও সুবিধাজনক এপিআই সহ।
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');
bufferSize
আপনি যে স্ট্রিংটির পরিবর্তে এবং শেষ অংশটি সংরক্ষণ করে এবং বর্তমান সমস্যাটির সাথে সামঞ্জস্য করে থাকেন তবে আপনি যদি সমস্যাটি এড়াতে পারেন তবে তার চেয়ে বেশি সময় নির্ধারণ করে ।
একটি ছোট স্টোরহোল্ডারকে একটি বড় স্ট্রিং কোড দিয়ে প্রতিস্থাপন করার সময় আমি সমস্যার মধ্যে পড়েছিলাম।
আমি করছিলাম:
var replaced = original.replace('PLACEHOLDER', largeStringVar);
আমি এখানে জাভাস্ক্রিপ্টের বিশেষ প্রতিস্থাপনের নিদর্শনগুলি বর্ণনা করেছি । যেহেতু আমি কোডটি প্রতিস্থাপনের স্ট্রিং হিসাবে ব্যবহার করছিলাম তাতে কিছু ছিল$
ছিল তাই এটি আউটপুটটি গোলমাল করছে।
আমার সমাধানটি ছিল ফাংশন রিপ্লেসমেন্ট বিকল্পটি ব্যবহার করা, যা কোনও বিশেষ প্রতিস্থাপন করে না:
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
}
দ্রষ্টব্য, কেবল ছোট ফাইলগুলির জন্য এগুলি মেমরিতে পড়বে।
লিনাক্স বা ম্যাকে, কীপটি সহজ এবং খোলের সাহায্যে কেবল সেড ব্যবহার করুন। কোন বাহ্যিক গ্রন্থাগার প্রয়োজন। নিম্নলিখিত কোড লিনাক্সে কাজ করে।
const shell = require('child_process').execSync
shell(`sed -i "s!oldString!newString!g" ./yourFile.js`)
সেড সিনট্যাক্স ম্যাকের ক্ষেত্রে কিছুটা আলাদা। আমি এখনই এটি পরীক্ষা করতে পারছি না, তবে আমি বিশ্বাস করি যে "-i" এর পরে আপনাকে খালি স্ট্রিং যুক্ত করতে হবে:
const shell = require('child_process').execSync
shell(`sed -i "" "s!oldString!newString!g" ./yourFile.js`)
ফাইনালের পরে "জি"! " সেড একটি লাইনে সমস্ত দৃষ্টান্ত প্রতিস্থাপন করে। এটি সরান, এবং প্রতি লাইনে প্রথম ঘটনাটি প্রতিস্থাপন করা হবে।
@ সানবারের উত্তরে সম্প্রসারণ করা, এটি করার সর্বাধিক দক্ষ উপায় হ'ল আসল ফাইলটি একটি স্ট্রিম হিসাবে পড়া এবং তারপরে প্রতিটি অংশকে একটি নতুন ফাইলে স্ট্রিম করা এবং শেষ পর্যন্ত নতুন ফাইলটি দিয়ে মূল ফাইলটি প্রতিস্থাপন করা।
async function findAndReplaceFile(regexFindPattern, replaceValue, originalFile) {
const updatedFile = `${originalFile}.updated`;
return new Promise((resolve, reject) => {
const readStream = fs.createReadStream(originalFile, { encoding: 'utf8', autoClose: true });
const writeStream = fs.createWriteStream(updatedFile, { encoding: 'utf8', autoClose: true });
// For each chunk, do the find & replace, and write it to the new file stream
readStream.on('data', (chunk) => {
chunk = chunk.toString().replace(regexFindPattern, replaceValue);
writeStream.write(chunk);
});
// Once we've finished reading the original file...
readStream.on('end', () => {
writeStream.end(); // emits 'finish' event, executes below statement
});
// Replace the original file with the updated file
writeStream.on('finish', async () => {
try {
await _renameFile(originalFile, updatedFile);
resolve();
} catch (error) {
reject(`Error: Error renaming ${originalFile} to ${updatedFile} => ${error.message}`);
}
});
readStream.on('error', (error) => reject(`Error: Error reading ${originalFile} => ${error.message}`));
writeStream.on('error', (error) => reject(`Error: Error writing to ${updatedFile} => ${error.message}`));
});
}
async function _renameFile(oldPath, newPath) {
return new Promise((resolve, reject) => {
fs.rename(oldPath, newPath, (error) => {
if (error) {
reject(error);
} else {
resolve();
}
});
});
}
// Testing it...
(async () => {
try {
await findAndReplaceFile(/"some regex"/g, "someReplaceValue", "someFilePath");
} catch(error) {
console.log(error);
}
})()
আমি এর পরিবর্তে একটি দ্বৈত স্রোত ব্যবহার করব। এখানে ডকুমেন্ট নোডেজ ডক দ্বৈত স্রোত
ট্রান্সফর্ম স্ট্রিম একটি দ্বৈত প্রবাহ যেখানে আউটপুটটি কোনওভাবে ইনপুট থেকে গণনা করা হয়।
<p>Please click in the following {{link}} to verify the account</p>
function renderHTML(templatePath: string, object) {
const template = fileSystem.readFileSync(path.join(Application.staticDirectory, templatePath + '.html'), 'utf8');
return template.match(/\{{(.*?)\}}/ig).reduce((acc, binding) => {
const property = binding.substring(2, binding.length - 2);
return `${acc}${template.replace(/\{{(.*?)\}}/, object[property])}`;
}, '');
}
renderHTML(templateName, { link: 'SomeLink' })
নিশ্চিতরূপে আপনি স্ট্রিম হিসাবে পড়ার জন্য রিডিং টেম্পলেট ফাংশনটিকে উন্নত করতে পারেন এবং এটিকে আরও দক্ষ করে তুলতে লাইন দ্বারা বাইট রচনা করুন