2

我必须让这个命令从我的 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 and last' file”:错误=2,没有这样的文件或目录。

谁能建议它哪里出错了?

4

1 回答 1

2

也许你需要这样的东西?

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

问题是ProcessSeq影响将要执行的参数。在你的情况下, perl -ne '/pattern/ && print $1 and last' filename

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

scala.sys.process文档向您展示了几乎所有内容。如果您的文件是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
于 2013-10-31T13:43:36.700 回答