我運行一個Perl腳本,替換另一個字符串不運行:Perl腳本在終端運行,但是從Java程序調用時
perl -pi.back -e 's/str1/str2/g;' path/to/file1.txt
當我運行從終端這個命令很好替換所有在給定文件中出現str1
到str2
。當我運行這個從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
'exec()'返回給你一個'Process',它有'getInputStream()'和'getErrorStream()'方法返回你創建進程的任何輸出。看看這個過程輸出了什麼。 –
根據操作系統的不同,您的Java程序可能沒有Perl的路徑。您需要將完整路徑放入Perl二進制文件中。這不是實現它的唯一方法,而是最簡單的方法之一。 – octopusgrabbus
@DenisTulskiy我已經做到了。它們什麼都不輸出 – a90