我正在尝试在 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 为我做这件事(我还需要转义许多其他字符)。
还有其他方法可以运行此命令吗?
最佳答案
转义文件名很容易:
val escapedFilename = "'" + filename.replace("'", "'\\''") + "'"
但正确的做法是将文件名直接传递给 grep:
Process(Seq("grep", "abc", filename)).run()
在 shell 中等价于此:
grep abc "example file.txt"
关于带管道的 Scala 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24298281/