6

文字列を別の文字列に置き換える Perl スクリプトを実行していました。

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で編集されているようです(リロードが必要です))。
  • ProcessBuilderJavaクラスを試しましたが、同じ結果が発生します。
  • Runtime.exec()またはProcessBuilderのような他のコマンドを使用するとgedit newFile.txt、うまく機能します。
  • 皮肉なことに、上記の perl コマンドを Java から出力し、ターミナルにペーストすると、置換操作が完了しました!
  • これらのコマンドを使用しても、例外やエラーは発生しません。(これを確実にするためにtryとcatchを使用しました)。
  • また、perl cmd が確実に実行されるように、cmd の/usr/bin/perl代わりに使用しました。perl

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

編集:

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
4

1 に答える 1

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)。または、コマンドを解析するオプションがない場合は、実際にシェルを呼び出して解析することができますexec(String[] cmdarray)

  • sh(指図)
  • -c
  • perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt
于 2012-12-24T14:27:23.133 に答える