Scala过程用管道

时间:2014-06-19 03:25:37

标签: scala process escaping

我正在尝试在scala中运行像这样的bash命令:

cat "example file.txt" | grep abc

Scala有一个特殊的流程管道语法,所以这是我的第一个方法:

val filename = "example file.txt"
(Process(Seq("cat", filename)) #| Process(Seq("grep", "abc"))).run()

据我了解,这会执行第一个进程,将输出读回scala并将其提供给第二个进程。问题是,出于性能原因,我想在不离开终端的情况下执行这两个进程。文件很大,我不需要整个输出,这就是我首先使用grep的原因。所以,我的第二个方法就是这个:

val filename = "example file.txt"
(Process(Seq("bash", "-c", "cat " + filename + " | grep abc"))).run()

这里的问题是如果文件名有空格则会中断。我可以尝试逃避空间,但我宁愿让scala为我做这件事(还有许多其他角色我也需要逃脱)。

还有其他方法可以运行此命令吗?

1 个答案:

答案 0 :(得分:1)

转义文件名很容易:

val escapedFilename = "'" + filename.replace("'", "'\\''") + "'"

但正确的方法是将文件名直接传递给grep:

Process(Seq("grep", "abc", filename)).run()

在shell中等效于此:

grep abc "example file.txt"