草庐IT

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

coder 2024-03-31 原文

我正在运行一个用另一个字符串替换字符串的 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 使用 StringTokenizer 来解析命令,它显然只是在空格处拆分。

以以下 shell 命令为例(与您的类似但不同):

perl -pi.back -e 's/a/b/g; s/c/d/g;' path/to/file1.txt

为此,StringTokenizer 生成以下命令和参数:

  • perl(命令)
  • -pi.back
  • -e
  • 的/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;'路径/to/file1.txt

关于java - Perl 脚本在终端中运行,但在从 Java 程序调用时不运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14022114/

有关java - Perl 脚本在终端中运行,但在从 Java 程序调用时不运行的更多相关文章

  1. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  4. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  5. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  9. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  10. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

随机推荐