2

我正在尝试编写一个 Java 程序,该程序在 Java 中采用字符串并替换 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”等。

4

3 回答 3

7

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

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

应按预期创建输出文件。

于 2013-07-02T19:09:39.043 回答
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

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

于 2013-07-02T19:44:22.290 回答
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 参数。

于 2013-07-02T18:49:21.113 回答