如何把这个Python代码翻译成Node.js

我在这里得到了一个非常好的答案,关于如何清除一行/删除文件中的一行,而不必截断文件或用新版本的文件replace文件,下面是Python代码:

#!/usr/bin/env python import re,os,sys logfile = sys.argv[1] regex = sys.argv[2] pattern = re.compile(regex) with open(logfile,"r+") as f: while True: old_offset = f.tell() l = f.readline() if not l: break if pattern.search(l): # match: blank the line new_offset = f.tell() if old_offset > len(os.linesep): old_offset-=len(os.linesep) f.seek(old_offset) f.write(" "*(new_offset-old_offset-len(os.linesep))) 

这个脚本可以这样调用:

 ./clear-line.py <file> <pattern> 

为了教育目的,我想弄清楚是否可以在Node.js中写这个。 我当然可以逐行阅读一个带有Node.js的文件。 但是我不确定在这种情况下Node.js是否具有tell / seek的等价调用。

相当于写作是肯定的

https://nodejs.org/api/fs.html#fs_fs_write_fd_buffer_offset_length_position_callback

这是我的尝试

 #!/usr/bin/env node const readline = require('readline'); const fs = require('fs'); const file = process.argv[2]; const rgx = process.argv[3]; const fd = fs.openSync(file, 'r+'); const rl = readline.createInterface({ input: fs.createReadStream(null, {fd: fd}) }); let position = 0; const onLine = line => { position += line.length; if (String(line).match(rgx)) { let len = line.length; rl.close(); rl.removeListener('line', onLine); // output the line that will be replaced/removed process.stdout.write(line); fs.write(fd, new Array(len + 1).join(' '), position, 'utf8', err => { if (err) { process.stderr.write(err.stack || err); process.exit(1); } else { process.exit(0); } }); } }; rl.on('line', onLine); 

这是不正确的 – 我不认为我正确计算偏移量/位置。 也许有人知道Python和Node可以帮助我。 我不是很熟悉计算文件中的位置/偏移,特别是在缓冲区方面。

这是我正在使用的文本文件中的数据。 我想要做的只是读取第一行不是空的,然后从文件中删除该行,然后将该行写入stdout。

这实际上可以是任何非空白数据,但这里是我正在使用的JSON:

 {"dateCreated":"2016-12-26T09:52:03.250Z","pid":5371,"count":0,"uid":"7133d123-e6b8-4109-902b-7a90ade7c655","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.290Z","pid":5371,"count":1,"uid":"e881b0a9-8c28-42bb-8a9d-8109587777d0","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.390Z","pid":5371,"count":2,"uid":"065e51ff-14b8-4454-9ae5-b85152cfcb64","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.491Z","pid":5371,"count":3,"uid":"5af80a95-ff9d-4252-9c4e-0e421fd9320f","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.595Z","pid":5371,"count":4,"uid":"961e578f-288b-413c-b933-b791f833c037","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.696Z","pid":5371,"count":5,"uid":"a65cbf78-2ea1-4c3a-9beb-b4bf56e83a6b","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.799Z","pid":5371,"count":6,"uid":"d411e917-ad25-455f-9449-ae4d31c7b1ad","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:03.898Z","pid":5371,"count":7,"uid":"46f8841d-c86c-43f2-b440-8ab7feea7527","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:04.002Z","pid":5371,"count":8,"uid":"81b5ce7e-2f4d-4acb-884c-442c5ac4490f","isRead":false,"line":"foo bar baz"} {"dateCreated":"2016-12-26T09:52:04.101Z","pid":5371,"count":9,"uid":"120ff45d-74e7-464e-abd5-94c41e3cd089","isRead":false,"line":"foo bar baz"} 

你应该考虑到每行结尾的换行符,这不包含在你通过readline模块获得的'行'中。 也就是说,你应该将position += (line.length + 1)更新到position += (line.length + 1) ,然后在写入时,只使用position (不带-1 )。

好吧,我想我知道了,但如果有人有这个牛肉,请随时批评。 这很接近,但我认为需要一些微调,似乎有一个错误或类似的错误。

 #!/usr/bin/env node const readline = require('readline'); const fs = require('fs'); const file = process.argv[2]; const rgx = new RegExp(process.argv[3]); const fd = fs.openSync(file, 'r+'); const rl = readline.createInterface({ input: fs.createReadStream(null, {fd: fd}) }); let position = 0; const onLine = line => { if (String(line).match(rgx)) { let len = line.length; rl.close(); rl.removeListener('line', onLine); // output the line that will be replaced/removed process.stdout.write(line + '\n'); fs.write(fd, new Array(len + 1).join(' '), position, 'utf8', (err, written, string) => { if (err) { process.stderr.write(err.stack || err); return process.exit(1); } else { process.exit(0); } }); } position += (line.length + 1); // 1 is length of \n character }; rl.on('line', onLine);