我正在运行一个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
cmd的方法来确保执行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
用于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)
。或者,如果您没有解析命令的选项,则可以通过将以下内容传递给shell来实际调用shell来解析该命令exec(String[] cmdarray)
:
sh
(命令)-c
perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt
我有以下文件夹结构: null 当我运行Pycharm的fish.py时,它工作得非常好。但是,当我从终端运行fish.py时,我得到错误的模块。 我在终端中使用的命令:来自应用程序文件夹。 我已经研究了这里建议的解决方案:从不同的文件夹导入文件,将应用程序文件夹的路径添加到帮助中。但是,我想知道是否有其他方法可以使它工作,而不在中添加两行代码。这是因为我在/products目录中有许多脚本,不想
我有一个简单的Java代码: 文件夹结构为: 在文件夹中,有和文件。 null null 这里怎么了?
问题内容: 当我尝试从PyCharm IDE运行程序时,一切正常,但是如果我输入Fedora: 在shell提示中,我从1个模块收到导入错误。 当从IDE启动时,PyCharm可以执行哪些操作以使解释器找到我的依赖项?如何获得脚本以找到其依赖项,以便可以使用singe命令启动它? 问题答案: 有一些可能的原因可能导致这种情况: 相同的python解释器?检查与 它是同一工作目录吗?检查与 中的差异
问题内容: 我有一个文件,其中我必须替换所有单词,如$ xyz,对于它们,我必须替换为以下内容: 这个文件也有一些像$ {abcd}这样的词,我不必更改。我正在使用此命令 sed -i’s?\ $([A-Z _] +)?\ $ {\ 1}?g’文件 它可以在命令行上正常工作,但不能在perl脚本中作为 ; 我想念什么?我认为添加一些反斜杠会有所帮助。我尝试添加一些但没有成功。 谢谢 问题答案: 在
我有一个包含4个命令的批处理脚本,如下所示 当我双击批处理文件时,它运行得很好。当我尝试从命令提示符运行批处理文件时,它没有看到要删除的. csv文件,我不确定这是为什么,但我认为这对我的目的并不重要。 当我从task scheduler手动运行任务时,它会截断数据库中的表并删除现有的csv文件,但没有创建新文件,这使我相信它会卡在.vbs文件上。 我试着用。vbs脚本,并将路径传递给。xls和。
我在尝试从Java运行R脚本时遇到了一个问题。我真的在互联网上寻找这个问题的答案,但什么都不管用。 求你帮帮我 这是java代码 以下是当我添加Runtime.getRuntime(). exec("Rcript"rScriptFileName)时抛出的错误消息: