我正在运行一个用另一个字符串替换字符串的 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 中编辑(需要重新加载))。
- 我尝试了 Java
ProcessBuilder
类,但结果相同。 - 当我使用
Runtime.exec()
或ProcessBuilder
与其他命令(如gedit newFile.txt
)一起使用时,它们运行良好。 - 具有讽刺意味的是,我从 java 打印了上面的 perl 命令并在终端中粘贴,替换操作完成!
- 使用这些命令不会出现异常或错误。(我使用 try and 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