带管道的 Scala 进程

标签 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 为我做这件事(我还需要转义许多其他字符)。

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

最佳答案

转义文件名很容易:

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/

相关文章:

java - 如何在 linux 上从 rest 服务执行 sh 文件

php - 没有连接的多字节的mysql_real_escape_string?

postgresql - PreparedStatement 不起作用时如何在 JDBC 中转义 SQL 参数?

scala - Unresolved 依赖项 — com.typesafe.play#sbt-plugin;2.4.3 : not found

java - maven project 和 sbt project and play framework 是否考虑共享一个存储库?

java - 从 Java 运行 "sandbox"内的可执行文件

Bash/C shell : Are there any drawbacks about escaping all characters of a file path?

scala - Scala 中 2 个集合的叉积

scala - 帮助我理解这个 Scala 代码 : scalaz IO Monad

linux - 在 Docker 容器中运行的进程的主机中的 PID 是什么?