readline rl.write如何工作?

我试图parsing一个文件,并用“bazbar”行代替“foobar”。 它只是返回一个空文件。 我不知道我在做什么错,文档不是特别有用。

var readline = require('readline'); var fs = require('fs'); var rl = readline.createInterface({ input: fs.createReadStream('test/in.txt'), output: fs.createWriteStream('test/out.txt', { flags: 'r+' }) }); rl.on('line', function (line) { if (line.match(/foobar/)) { rl.write(line.replace(/foo/, 'baz')); } }); 

这是tmp回购,如果有人只是拉动和搞乱它: https : //github.com/corysimmons/css-body-components/tree/master/test

这可能不会回答你的问题,但它完成了任务。

我无法使用rl.write来对WriteStream文件进行操作,但是通过直接写入文件WriteStream来实现它。 代码如下:

 var readline = require('readline'); var fs = require('fs'); var ws = fs.createWriteStream(__dirname + '/test/out.txt', { flags: 'r+', defaultEncoding: 'utf8' }) var rl = readline.createInterface({ input: fs.createReadStream(__dirname + '/test/in.txt') }); rl.on('line', function (line) { if (line.match(/foobar/)) { line = line.replace(/foo/, 'baz'); } ws.write(line + '\n'); }); rl.on('close', function() { ws.close() }) 

编辑: rl.write将只写入一个TTY

查看readline的来源 ,Node正在检查output提供的stream是否是terminal。 如果是的话,它写入stream,如果不是,它看起来像它将重新发射写入line事件。

这意味着你必须欺骗readline模块,以为你的fs.WriteStream实际上是一个TTY。 这里有一些更新的代码可以工作。 注意第5行添加了isTTY属性并将其设置为true

 var readline = require('readline'); var fs = require('fs'); var ws = fs.createWriteStream(__dirname + '/test/out.txt', { flags: 'r+', defaultEncoding: 'utf8' }) ws.isTTY = true var rl = readline.createInterface({ input: fs.createReadStream(__dirname + '/test/in.txt'), output: ws }); rl.on('line', function (line) { var ln if (line.match(/foobar/)) { ln = line.replace(/foo/, 'baz') } rl.write(ln, '\n') });