我正在尝试编写一个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”等。
答案 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参数。