2

我正在尝试创建一个 java 程序,它接受一些用户输入变量并将它们传递给 perl 脚本(它实际上在 perl 脚本中找到某个字符串并将其替换为用户输入变量)。这是代码:

    String sedMain = "sed -e ";
    String sedFirstLine = "'s/AAA/"+newFirstLine+"/' -e ";
    String sedNewCntr = "'s/BBB/"+newCntr+"/' -e ";
    String sedNewSpacing = "'s/SPACE/"+newSpacing+"/' -e ";
    String sedNewDmax = "'s/MAX/"+newDmax+"/'";
    String sedFile = " /filepath/myperlscript.pl >  /filepath/myNEWperlscript.pl";
    String sedCommand=sedMain+sedFirstLine+sedNewCntr+sedNewSpacing+sedNewDmax+sedFile;
    System.out.println("SED COMMAND: "+sedCommand);
    String testRun = "touch /filepath/hello.txt";
    Process runSedCommand;
    runSedCommand = Runtime.getRuntime().exec(sedCommand);

我正在使用 IDE,当 sed 命令打印到控制台时,它看起来是正确的。我从控制台复制了 sed 命令并从终端运行它,它工作正常。我写了字符串“testRun”来查看Java中的进程是否有问题,它创建了文件“hello.txt”。但是由于某种原因,我的程序没有创建输出 perl 文件“myNEWperlscript.pl”。我很困惑为什么这不起作用。任何人都可以帮忙吗?

4

2 回答 2

3

exec() 将带有程序名称和参数的 String[] 作为其元素,但是您将所有内容连接到一个 String 中,因此有效地丢失了参数。

尝试这样的事情:

String[] cmd = {"sed", "first argument", "second argument"};
Runtime.getRuntime().exec(cmd);
于 2013-07-02T15:26:31.113 回答
2

使用

exec(String[] cmdarray) 

签名。命令是 sed,-e 是一个参数,'s/AAA/\n/' 是另一个参数,依此类推。所以你会有

String[] command = new String[] {"sed", "-e", "s/AAA/\n/", "next parameter without single quotes", , "next parameter without quotes..."}
Runtime.getRuntime.exec(command);

这是您的参数在通往 shell 的途中得到良好格式化的唯一方法,否则可能会发生奇怪的 sruff,因为字符串上第一个标记之后的任何引号都将被视为一个参数,因此可以转义引号之类的东西那

于 2013-07-02T15:28:16.173 回答