2015-08-28 85 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"}; 

感謝