当前位置: 首页 > 面试题库 >

Perl脚本在终端中运行,但从Java程序调用时则不运行

年业
2023-03-14
问题内容

我正在运行一个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命令,并将其粘贴到终端中,然后完成了替换操作!
  • 使用这些命令不会出现异常或错误。(我尝试并抓住以确保这一点)。
  • 我还使用了/usr/bin/perl代替perlcmd的方法来确保执行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)时抛出的错误消息: