2012-12-24 3 views
6

から呼び出されたときに実行されません: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コマンドを印刷し、端末に貼り付けて置き換え操作が完了しました!
  • これらのコマンドを使用した例外またはエラーはありません。 (私はこれを確実にするために試してキャッチを使用した)。
  • また、cmdにperlの代わりに/usr/bin/perlを使用して、perl cmdが確実に実行されるようにしました。

だから、問題は何だと思いますか?

EDIT:

私はJavaでコマンドから引用符を削除することによってこの問題を解決しました。 @ikegamiに助けてくれてありがとう。 ので、作業バージョンは次のとおりです。代わりに

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

'exec()'はプロセスを返します。プロセスが生成する出力を返す 'getInputStream()'と 'getErrorStream()'メソッドを持っています。このプロセスが出力するものを参照してください。 –

+1

OSによっては、あなたのJavaプログラムがPerlへのパスを持っていない可能性があります。 Perlバイナリに完全なパスを入れる必要があります。これは唯一の方法ではありませんが、最も簡単な方法の1つです。 – octopusgrabbus

+0

@DenisTulskiy私はすでにこれをしました。彼らは何も出力しません。 – a90

答えて

5

exec

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

は明らかにちょうど空白でsplitコマンドを、解析するStringTokenizerを使用しています。例えば

テイク(あなたより似ているが異なる)次のシェルコマンド:

  • perl(コマンド)
  • :それについては

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

    StringTokenizer次のコマンドと引数を生成します-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)です。あなたはコマンドを解析するオプションを持っていない場合は、あなたが実際にexec(String[] cmdarray)に以下を渡すことで、あなたのためにそれを解析するためにシェルを起動することができます:

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

@ARGV 'perl -pi.back -e' s/str1/str2/g;には 'perl -le'printを試してください。 path/to/file1.txt'を実行し、実際にシェルがPerlに渡すものを確認してください。また、 '-e'の後に(不必要な)スペースを入れずに試してみるべきです。 – ikegami

関連する問題