【发布时间】:2012-12-24 13:38:51
【问题描述】:
我正在运行一个用另一个字符串替换字符串的 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 和 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 二进制文件中。这不是唯一的方法,而是最简单的方法之一。
-
@DenisTulskiy 我已经这样做了。他们什么也没输出。
-
@octopusgrabbus 我这样做了,但也有同样的问题。
-
@ikegami 我欠你一个。删除引号让它工作!谢谢,但我想问我为什么要删除引号?
标签: java perl runtime.exec