从scala进程运行perl命令

时间:2013-10-31 13:30:39

标签: regex scala command system

我必须从我的scala代码

运行此命令
perl -ne '/pattern/ && print $1 and last' filename

我试过了

val re = """pattern"""
 val file = "filename"
 val v= (Process(Seq("""perl -ne '/"""+re+"""/ && print $1 and last' """+file))).!!

但有些人虽然生成了命令行所需的相同命令,但仍无法正常工作。它说:

java.io.IOException:无法运行程序“perl -ne'/ pattern /&& print $ 1和last'file”:error = 2,没有这样的文件或目录。

有谁可以建议哪里出错?

1 个答案:

答案 0 :(得分:2)

也许你需要这样的东西?

 val pattern: String = "..." // your pattern
 val perlCode = s""" '/$pattern/ && print $$1 and last' """
 val v = (Process(Seq("perl", "-ne", perlCode, file))).!!

问题是Process需要执行Seq个参数。在你的情况下, perl -ne '/pattern/ && print $1 and last' filename

perl是第一个,-ne是第二个,后跟perl代码/pattern/ && print $1 and last(请注意,单引号'不相关,它们只是用于确保将代码字符串作为单个参数传递给perl),最后你有文件名。

scala.sys.process docs显示了你几乎所有的东西。如果您的文件是java.io.File,请尝试:

 val perlCmd = Seq("perl", "-ne", perlCode)
 val file = new java.io.File("/tmp/f.txt")
 val result = perlCmd #< file !!

相同
perl -ne '/pattern/ && print $1 and last' < /tmp.txt