2015-08-28 61 views
0

当我试图用Java执行它时,SED命令没有执行,而手动执行成功。没有回应&在输出中看不到错误。java sed命令没有产生响应

我的SED命令: 手动:

sed -i 's/abc/xyz/' /home/tmp.txt 

在java中的文件:

String[] cmdtest = {"sed ", "-i","'s/abc/xyz/'"," /home/tmp.txt"}; 

过程:

StringBuffer output = new StringBuffer(); 
Process p = null; 
try { 
    p = Runtime.getRuntime().exec(cmdtest); 
    p.waitFor(); 
    BufferedReader reader = 
     new BufferedReader(new InputStreamReader(p.getInputStream())); 

    String line = ""; 
    while ((line = reader.readLine())!= null) { 
      output.append(line + "\n"); 
    } 

} catch (Exception e) { 
     e.printStackTrace(); 
} 
+1

'sed的-i'不产生任何输出,你有什么期待看到? –

回答

1

你先waitFor过程结束,然后继续读它的输出。您必须在流程运行时接受输出;否则它的输出缓冲区将被填满,然后该进程将阻塞,直到你耗尽它。所以只要删除waitFor,它就会开始工作。

此外,超出了这个问题在Java方面,我看到你是如何构建的命令行的问题:

{"sed " + "-i","'s/abc/xyz/'"," /home/tmp.txt"} 
  1. 的第一个元素是"sed -i" —显然你意味着-i是第一参数,而不是命令名称的一部分。
  2. 你有'...'围绕第二个参数:这将被直接传递到sed,使其成为一个无效的命令规范。引号仅在shell提示符处需要。
  3. 最后一个参数在前面有一个额外的空间,这也可能导致问题。
  4. 调用sed-i命令它在原地更改文件,根本不产生任何输出。

所以也许你想,而不是

{"sed", "s/abc/xyz/", "/home/tmp.txt"} 
+0

还有一件事,请帮忙。我怎么能在这些命令中使用backslaches将 – user3356868

+0

http://stackoverflow.com/questions/32274107/sed-need-to-use-in-string-to-append-using-sed – user3356868

1

线

String[] cmdtest = {"sed " + "-i","'s/abc/xyz/'"," /home/tmp.txt"}; 

故障。

  • 要运行的程序的名称是sed而不是sed-i
  • 您要运行的SED脚本是s/abc/xyz/,而不是's/abc/xyz/'(注意引号)。
  • 要编辑的teh文件的路径名是/home/tmp.txt,而不是/home/tmp.txt(请注意额外的空间)。

试试这个:

String[] cmdtest = {"sed", "-i","s/abc/xyz/","/home/tmp.txt"}; 
+0

谢谢你的工作,你能告诉我如何使用/也可以在命令中使用。在此先感谢 – user3356868

+0

@ user3356868看来我们已经回答了您的原始问题。如果你有一个单独的问题,[把它作为一个单独的问题](http://meta.stackexchange.com/questions/43478/exit-strategies-for-chameleon-questions)。 – Raedwald

0

raedwald &马尔科给了正确的答案。使用

String[] cmdtest = {"sed", "-i","s/abc/xyz/","/home/tmp.txt"}; 

感谢