我正在寻找模仿perl's diamond operator或python's fileinput的函数或运算符(可能是库)。
当然我可以检查自己的参数,确保每个都是一个文件并循环,如果不存在从stdin中读取...但这就失败了一个目的:在几秒钟内创建小的unix命令行脚本,需要循环通过文件或stdin,如cat,grep,sed等。不必写30行样板代码......只需要一两行。
答案 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) }
}