js 代码如何使用终端获取输入文件?



所以我需要在终端中使用输入文件,当我编写以下cat input.txt | node prog.js >result.txt

我的代码是:

var fs = require('fs');
var str = fs.readFileSync('input.txt', 'utf8');
str.replace(/^s*[rn]/gm,"").split(/s+/).forEach(function (s) {
return console.log(
s === 'bob'
? 'boy'
: s === 'alicia'
? 'girl'
: s === 'cookie'
? 'dog'
: 'unknown');
});

我需要我的代码来获取输入文档,而不管用户可能为其指定的名称如何。获取用户输入的正确方法是什么?

如果将值管道传输到节点.js脚本,则必须侦听process对象可用的readabledata事件侦听器。使用data事件侦听器将流直接置于流动模式,每当使用readable事件侦听器时,都必须使用process.stdin.read()强制 stdin 进入流动模式。要写入另一个命令或另一个脚本,您必须使用process.stdout.write(),它是一个可写的流。

流动模式

#!/usr/bin/env node
let chunks = "";
process.stdin.on("data", data => {
// data is an instance of the Buffer object, we have to convert it to a string
chunks += data.toString();
})
// the end event listener is triggered whenever there is no more data to read
process.stdin.on("end", () => {
// pipe out the data to another command or write to a file
process.stdout.write(chunks);
});

非流动模式

#!/usr/bin/env node
process.stdin.on("readable", () => {
const flowingMode = process.stdin.read();
// flowingMode will become null, whenever there is no more data to read
if ( flowingMode )
chunks += flowingMode.toString();
})
process.stdin.on("end", () => {
process.stdout.write(chunks);   
})

为了防止自己承受所有这些压力,如果readabledata事件处理程序上没有逻辑,您可以执行以下操作

#!/usr/bin/env node
process.stdin.pipe(process.stdout);

如果你想在触发end事件侦听器时做一些事情,你应该这样做

#!/usr/bin/env node
process.stdin.pipe(process.stdout, { end: false } );
process.stdin.on("end", () => /* logic */ );

触发end事件侦听器时,执行代码

#!/usr/bin/env node
let chunk = "";
process.stdin.on("data", data => {
chunk += data.toString();
});
process.stdin.on("end", () => {
chunk.replace(/^s*[rn]/gm,"").split(/s+/).forEach(function (s) {
process.stdout.write(
s === 'bob'
? 'boy'
: s === 'alicia'
? 'girl'
: s === 'cookie'
? 'dog'
: 'unknown');
});
});
> cat input.txt | ./prog.js > result.txt

将某些内容管道到节点脚本中确实需要您从process.stdin中读取,正如@T.J.Crowder所提到的。

看看这篇文章,它解释了这个想法,并有一个很好的例子可以遵循: https://blog.rapid7.com/2015/10/20/unleash-the-power-of-node-js-for-shell-scripting-part-1/例如:

#!/usr/bin/env node 
const readInput = callback => {
let input = '';
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
const chunk = process.stdin.read();
if (chunk !== null) {
input += chunk;
}
});
process.stdin.on('end', () => callback(input));
}
readInput(console.log);

你要问的是"如何从标准输入中读取?答案是用process.stdin,这是一个Stream

最新更新