相当于groovy中的perl diamond / python fileinput?

时间:2014-11-19 11:24:39

标签: groovy

我正在寻找模仿perl's diamond operatorpython's fileinput的函数或运算符(可能是库)。

当然我可以检查自己的参数,确保每个都是一个文件并循环,如果不存在从stdin中读取...但这就失败了一个目的:在几秒钟内创建小的unix命令行脚本,需要循环通过文件或stdin,如cat,grep,sed等。不必写30行样板代码......只需要一两行。

2 个答案:

答案 0 :(得分:2)

据我所知,没有这样的内置函数/库。

无论如何,如果您的目标是创建脚本并循环遍历文件或stdin,您可以创建类似于groovy lib的东西。例如:

FileInput.groovy

class FileInput {
    static void input(String[] args, Closure c) {
        if (args) {
            args.collect { new File(it) }.findAll { it.isFile() }.each { it.eachLine(c) }
        } else {
            System.in.eachLine(c)
        }   
    }
}

然后编译上面的内容并将结果类放在~/.groovy/lib

$ groovyc -d ~/.groovy/lib FileInput.groovy

然后你可以在脚本中使用它

test.groovy

import FileInput

FileInput.input(args) { println it.toUpperCase() }

那样

$ groovy test.groovy example.txt
LINE ONE
LINE TWO
LINE THREE

没有文件时默认为 stdin

$ groovy test.groovy < example.txt
LINE ONE
LINE TWO
LINE THREE

$ cat example.txt | groovy test.groovy
LINE ONE
LINE TWO
LINE THREE

$ groovy test.groovy
hello
HELLO
world
WORLD

跳过dirs:

$ groovy test.groovy example.txt testDir
LINE ONE
LINE TWO
LINE THREE

现在(因为它正在测试isFile())也忽略了不存在的文件:

$ groovy test.groovy example.txt wrongFile.txt example.txt
LINE ONE
LINE TWO
LINE THREE
LINE ONE
LINE TWO
LINE THREE

答案 1 :(得分:1)

def inputs=[];

唯一可行的方法是收集“类似物品”。在这种情况下,有一个InputStream集合可以

if(args.length==0)
{
    inputs.add(System.in)
}
else  {
    args.each {
        inputs.add(new FileInputStream(it))    
    }
}

inputs.each {
    (it).eachLine { line -> println(line) }
}