【问题标题】:Split stdout and pipe each piece to command拆分标准输出并将每个部分通过管道传输到命令
【发布时间】:2015-08-26 17:56:30
【问题描述】:

我有一个像这样的javascript 文件。

var val = "foo"
console.log(val)
//EVALMD-STDOUT-FILE-DELIMETER
if (!val) var val = "bar"
console.log(val)
//EVALMD-STDOUT-FILE-DELIMETER
console.log(val)

我可以通过两种方式运行它。

node example.js 

或者我可以使用cat 输入。

cat example.js | node 

我试图弄清楚如何在我的情况下通过分隔符 //EVALMD-STDOUT-FILE-DELIMETER 拆分像 cat example.js 这样的标准输出,并将每个 node 作为单独的进程进行管道传输,而不是记录 foofoo,foo 我应该得到foo, bar,然后是一个错误。

上面的文件应该被拆分并解释为 3 个“块”

一个:

var val = "foo"
console.log(val)

两个:

if (!val) var val = "bar"
console.log(val)

三个:

console.log(val)

【问题讨论】:

  • 在该示例中,val 的定义只会出现在node 的第一个实例中。我的解释对吗?
  • 另外,您是否提前知道您将拥有多少个分隔符,或者您是否希望它动态找到它并在每次找到时启动一个新的节点实例?
  • @EricRenouf 当node运行上面的js时val被声明一次,是的。
  • @EricRenouf 我不知道字符串中有多少个分隔符。
  • 我的val 问题更像是在与这些分隔符拆分时您将拥有 3 个“文件”,其中只有一个会包含 var val = "foo" 行,另外两个会里面没有那条线,对吧?

标签: javascript node.js bash unix pipe


【解决方案1】:

如果您提前知道拆分的数量,可以扩展的部分解决方案类似于:

cat example.js | tee >(sed -n '1,_//EVALMD-STDOUT-FILE-DELIMETER_p' | node) >(sed -n '_//EVALMD-STDOUT-FILE-DELIMETER_,$p' | node) >/dev/null

最后一个>/dev/null 以防止tee 也将其打印到标准输出

如果您事先不了解以下脚本,您可以使用perl 来执行此操作:

open(my $out, "| node");
while(<>) {
    if(/\/\/EVALMD-STDOUT-FILE-DELIMETER/) {
        close($out);
        open($out, "| node");
        next;
    }
    print $out $_;
}

因此,您可以将一个文件放入其中,您可以将其作为 perl 脚本使用,也可以折叠成一个字符串并像这样运行它

cat example.js | perl -nle 'open(my $out, "| node");while(<>) {if(/\/\/EVALMD-STDOUT-FILE-DELIMETER/) {close($out);open($out, "| node");next;}print $out $_;}'

当然,您也可以简单地修改 perl 来读取文件本身,因此不需要 cat

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-18
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多