文字列を別の文字列に置き換える 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で編集されているようです(リロードが必要です))。
ProcessBuilder
Javaクラスを試しましたが、同じ結果が発生します。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