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

时间:2018-10-08 21:01:59

标签: javascript shell

所以我需要在终端中以及在编写以下cat input.txt | node prog.js >result.txt

时使用输入文件

我的代码是:

var fs = require('fs');
var str = fs.readFileSync('input.txt', 'utf8');

str.replace(/^\s*[\r\n]/gm,"").split(/\s+/).forEach(function (s) {
    return console.log(
    s === 'bob'
        ? 'boy'
        : s === 'alicia'
        ? 'girl'
        : s === 'cookie'
        ? 'dog'
        : 'unknown');
});

我需要我的代码来获取输入文档,而不管用户可以给它起什么名字。掌握用户输入的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

如果将值传递给node.js脚本,则必须侦听readable对象可用的dataprocess事件侦听器。使用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*[\r\n]/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

答案 1 :(得分:1)

如@ T.J.Crowder所述,将某些内容添加到Node脚本中确实需要您从process.stdin阅读。

请看一下这篇文章,它解释了这个想法,并附有一个很好的例子: 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);

答案 2 :(得分:0)

您要问的是“如何从标准输入中读取内容?”答案是使用process.stdin,即Stream