我运行了一个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");
ProcessBuilder
类,但同样的结果也发生了。Runtime.exec()
或ProcessBuilder
与其他命令(如gedit newFile.txt
)一起使用时,它们可以很好地工作。/usr/bin/perl
而不是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
发布于 2012-12-24 14:27:23
exec
使用StringTokenizer
解析命令,该命令显然只是在空格上拆分。
例如,下面的shell命令(类似但与您的命令不同):
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)
来调用一个shell来为您解析它
sh
(命令)-c
perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt
https://stackoverflow.com/questions/14022114
复制相似问题