2012-12-24 19 views
6

我運行一個Perl腳本,替換另一個字符串不運行:Perl腳本在終端運行,但是從Java程序調用時

perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt 

當我運行從終端這個命令很好替換所有在給定文件中出現str1str2。當我運行這個從Java它訪問該文件,但沒有發生更換:

Runtime.getRuntime().exec("perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt"); 
  • 我敢肯定,它訪問文件(該文件似乎在gedit中進行編輯(重裝所需的))。
  • 我嘗試了Java ProcessBuilder類,但發生了相同的結果。
  • 當我使用Runtime.exec()ProcessBuilder與其他命令(如gedit newFile.txt)他們工作得很好。具有諷刺意味的是,我從java打印了上面的perl命令,並在終端上粘貼並完成替換操作!
  • 使用這些命令不會出現異常或錯誤。 (我用try和catch來確保這一點)。
  • 我還在cmd中使用了/usr/bin/perl而不是perl以確保執行perl cmd。

那麼你認爲問題是什麼?

編輯:

我剛好在java中去除命令引號解決了這個問題。感謝@ikegami的幫助。 所以工作版本是:中

perl -pi.back -e s/str1/str2/g; path/to/file1.txt 

代替

perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt 
+0

'exec()'返回給你一個'Process',它有'getInputStream()'和'getErrorStream()'方法返回你創建進程的任何輸出。看看這個過程輸出了什麼。 –

+1

根據操作系統的不同,您的Java程序可能沒有Perl的路徑。您需要將完整路徑放入Perl二進制文件中。這不是實現它的唯一方法,而是最簡單的方法之一。 – octopusgrabbus

+0

@DenisTulskiy我已經做到了。它們什麼都不輸出 – a90

回答

5

exec使用StringTokenizer解析命令,這顯然只是按空白進行分割。

採取例如以下外殼命令(類似但比你的不同):

perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt 

對於它,StringTokenizer產生以下命令和參數:

  • perl(命令)
  • -pi.back
  • -e
  • 's/a/b/g;
  • s/c/d/g;'
  • path/to/file1.txt

這是完全錯誤的。命令和參數應該是

  • perl(命令)
  • -pi.back
  • -e
  • s/a/b/g; s/c/d/g;(注缺乏引號)
  • path/to/file1.txt

你可以通過這些以上至exec(String[] cmdarray)。或者,如果你沒有在解析命令的選項,你實際上可以調用一個shell來解析它,你在通過下面對exec(String[] cmdarray)

  • sh(命令)
  • -c
  • perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt
+0

您應該嘗試'perl -le'print for @ARGV'perl -pi.back -e's/str1/str2/g;' path/to/file1.txt'並查看shell實際傳遞給Perl的內容。你也應該在'-e'之後沒有(不必要的)空格來嘗試它。 – ikegami

相關問題