我正在尝试在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为我做这件事(还有许多其他角色我也需要逃脱)。
还有其他方法可以运行此命令吗?
答案 0 :(得分:1)
转义文件名很容易:
val escapedFilename = "'" + filename.replace("'", "'\\''") + "'"
但正确的方法是将文件名直接传递给grep:
Process(Seq("grep", "abc", filename)).run()
在shell中等效于此:
grep abc "example file.txt"