从app调用时,SED命令不生成输出文件

时间:2013-07-02 18:39:11

标签: java bash process sed runtime.exec

我正在尝试编写一个java程序,该程序在Java中使用Strings并替换perl脚本中相应的文本序列。这是我的代码:

    String sedFirstLine = "'s/AAA/"+newFirstLine+"/'";
    String sedNewCntr = "'s/BBB/"+newCntr+"/'";
    String sedNewSpacing = "'s/SPACE/"+newSpacing+"/'";
    String sedNewDmax = "'s/MAX/"+newDmax+"/'";
    String sedInputFile = "/filepath/myPerlScript.pl" 
    String sedOutputFile = "/filepath/myNewPerlScript.pl";
    String[] cmdArray3 = {"sed", "-e", sedFirstLine,"-e", sedNewCntr,"-e", sedNewSpacing,"-e", sedNewDmax, "-e", sedInputFile, ">", sedOutputFile};
    Process runCmd;
    runCmd = Runtime.getRuntime().exec(cmdArray3);

运行此程序时,不会生成输出文件“myNewPerlScript.pl”。我不确定我写的是什么问题。我之前提到的Java变量是“newFirstLine”,“newCntr”等。

3 个答案:

答案 0 :(得分:7)

这是因为输出重定向(即>)是shell的功能。为了重定向命令的输出,您可以通过shell调用该命令。例如,使用此命令

String[] cmdArray3 = {"bash", "-c", "sed 's/AAA/BBB/' inputfile > output"};
Process runCmd = Runtime.getRuntime().exec(cmdArray3);

应该按预期创建输出文件。

答案 1 :(得分:4)

ProcessBuilder版本:

String sedFirstLine = "'s/AAA/"+newFirstLine+"/'";
String sedNewCntr = "'s/BBB/"+newCntr+"/'";
String sedNewSpacing = "'s/SPACE/"+newSpacing+"/'";
String sedNewDmax = "'s/MAX/"+newDmax+"/'";

File directory = new File("/filepath");
File sedInputFile = new File(directory, "myPerlScript.pl"); 
File sedOutputFile = new File(directory, "myNewPerlScript.pl");
List<String> commandLine = new ArrayList<>();
Collections.addAll(commandLine,
    "sed",
    "-e", sedFirstLine,
    "-e", sedNewCntr,
    "-e", sedNewSpacing,
    "-e", sedNewDmax);
ProcessBuilder pb = new ProcessBuilder(commandLine);
pb.directory(directory);
pb.redirectInput(Redirect.from(sedInputFile));
pb.redirectOutput(Redirect.to(sedOutputFile));
Process sed = pb.start();
// Watch sed.getErrorStream() for errors.

请参阅ProcessBuilder Javadoc

你不必担心shell,因为Java负责重定向,正如@Chris Stratton指出的那样。只要确保以某种方式处理错误流;如果存在问题并且错误输出过多,则该过程可能会阻塞。但原始方法也有同样的问题。

答案 2 :(得分:1)

只需更改以下行:

String[] cmdArray3 = {"sed", "-e", sedFirstLine,"-e", sedNewCntr,"-e", sedNewSpacing,"-e", sedNewDmax, "-e", sedFile};

为:

String[] cmdArray3 = {"sed", "-e", sedFirstLine,"-e", sedNewCntr,"-e", sedNewSpacing,"-e", sedNewDmax, sedFile};

注意你拥有的额外-e参数。