Javascript readline rl.write是如何工作的?
我试图解析一个文件,并用“bazbar”替换“foobar”行。它只返回一个空文件。我不知道我做错了什么,医生也没有特别的帮助Javascript readline rl.write是如何工作的?,javascript,node.js,stream,readline,Javascript,Node.js,Stream,Readline,我试图解析一个文件,并用“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
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回购协议,如果有人对它感兴趣的话:这可能不能回答你的问题,但它完成了任务 我无法使用
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
查看,节点正在检查output
中提供的流是否是终端。如果是,它将写入流,如果不是,它看起来将作为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')
});
太好了,谢谢你。现在,我想知道如何替换该行,而不是在其下面追加一行。他们的文档说
rl.write(null,{ctrl:true,name:'u'})
应该删除该行,但它只是用大量奇怪的符号淹没了文件。你知道有没有更好的方法吗?也许只是解析整个文件并替换一些东西?Nvm我用这个得到了它。再次感谢您的帮助。=)