繰り返し似たような編集を行う場合、サクラエディタのマクロ機能などを使ったりしますが、
もうちょっと複雑な編集がしたい時など、javascriptで書けたりすると便利ですよね(正規表現や条件分岐を使いたい、とか)。
そんなとき、node.jsを使うと割と簡単に実現できそう。
var fs = require('fs'); exports.do = function(params, edit){ var params = params || {}; var bufSize = params.bufferSize || 512; var tempPath = params.path + ".tmp"; var rs = fs.createReadStream(params.path, { highWaterMark:bufSize }); var ws = fs.createWriteStream(tempPath); var lbuf = ''; rs.on('data', function(data) { var str = data.toString(); if (0 < str.indexOf("\n")) { lbuf += str; var line = lbuf.split("\n"); for (var i = 0; i < line.length - 1; i++) { ws.write(edit(line[i]) + "\n"); } lbuf = line[line.length - 1]; } else { lbuf += str; } }).on('end', function() { ws.write(edit(lbuf)); fs.unlink(params.path, function() { fs.rename(tempPath, params.path); }); }); };
上記スクリプトを edit_file.js として保存。
var edit_file = require('./edit_file'); var i = 0; edit_file.do({ path: "test.txt" }, function(line){ return (++i) + ": " + line; });
実際の編集部分を edit.js として保存。
node edit.js
でtest.txtが書き換わります。
edit_file.do の第二引数に行毎の処理を書いて結果をreturnする感じ。
(※上記の例では各行の先頭に行番号が入ります)
node.js現時点で最新のv0.12.4では、Stream3が使えるのできっともっと良いコードで書けるんでしょうけど、とりあえずやりたいことができたからこれでいいや、って感じッス。
node.jsももっと使えるようになりたいなあ。