2

Java で文字列を受け取り、対応する一連のテキストを perl スクリプトに置き換える Java プログラムを作成しようとしています。これが私のコードです:

    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

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が指摘したように、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 に答える