【问题标题】:Scala Process with pipe带有管道的 Scala 进程
【发布时间】:2014-06-19 03:25:36
【问题描述】:

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

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

【问题讨论】:

    标签: scala process escaping


    【解决方案1】:

    转义文件名很容易:

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

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

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

    在shell中相当于这个:

    grep abc "example file.txt"
    

    【讨论】:

    • 好的,你是对的,将文件名传递给 grep。我实际尝试运行的命令比这要复杂一些,这只是一个示例,我不能忽略管道。不过感谢转义提示,我试试看。
    • 已解决问题,谢谢。手动转义比我想象的要简单得多
    猜你喜欢
    • 2019-12-01
    • 1970-01-01
    • 2012-03-21
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多