【问题标题】:escaping sed characters java not working转义 sed 字符 java 不起作用
【发布时间】:2015-01-22 06:29:25
【问题描述】:

我首先要说我发现了很多与我相似的主题,但没有一个能够为我提供正确的答案。

我正在尝试使用以下 shell 脚本将字符串插入 xml 文件:

#!/bin/bash
cd /var/lib/tomcat7/webapps/Config || exit 
sudo sed -i '/<\/home>/i <entry>'"$@"'</entry>' data.xml

当执行这样的脚本时 ./script.sh “测试条目”,我的 xml 文件将如下所示:

<home>
    <entry>test entry</entry>
</home>

这就是我想要的。但是当我尝试通过 java 调用这个脚本时,我无法成功地转义引号。

我的java代码是这样的:

String entry = "test entry";
String command = "/home/user/addentry.sh " + "\"" + entry + "\"";
Process p = null;
Runtime run = Runtime.getRuntime();
    try {            
        p = run.exec(command);
    }     
    .....   

执行代码时,我的 xml 文件如下所示:

<home>
    <entry>"test
</home>

如您所见,报价也作为我输入的一部分传递。 将java代码更改为:

String command = "/home/user/addentry.sh " + entry;

它适用于没有空格的字符串(因此脚本只有 1 个参数)

提前致谢

【问题讨论】:

    标签: java string unix sed escaping


    【解决方案1】:

    试试这个:

    package org.script.test;
    
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) {
            if (args.length != 1) {
                System.out.println("Invalid arguments");
                return;
            }
            String entry="\"" +args[0]+ "\"";
            System.out.println("adding: " + entry);
    
            Process pr = null;
            try {
                pr =
     Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "cd /home/oracle/testscript ; . ./test.sh " + entry });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    调用者:

    假设包org.script.test

    java -Xms128M -Xmx128M -classpath testScript.jar org.script.test.Main "test entry"
    

    即使你不传递参数它也能工作:

    package org.mihai.script;
    
    import java.io.IOException;
    
    public class Main {
        public static void main(String[] args) {
            String entry = "test entry 2";
            System.out.println("adding: " + entry);
    
            Process pr = null;
            try {
                pr =
     Runtime.getRuntime().exec(new String[] { "/bin/sh", "-c", "cd /home/oracle/testscript ; . ./test.sh " + "\"" + entry +"\"" });
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    呼叫:

    java -Xms128M -Xmx128M -classpath testScript.jar org.mihai.script.Main
    

    输出数据.xml:

    <home>
    <entry>test entry</entry>
    <entry>test entry 2</entry>
    </home>
    

    【讨论】:

    • 感谢您的回复!但恐怕在执行新代码后(我已经尝试了两种解决方案)我的新 xml 看起来像这样: 所以我猜参数没有被传递.. .
    • 您可以尝试将您的脚本更改为不使用 sudo 吗?这是我用来测试的脚本,它运行良好:#!/bin/bash sed -i '//i '"$@"'' data.xml跨度>
    • 我不想问,但您是否更改了字符串以匹配您的路径和脚本名称?我在示例中留下了我机器上使用的那些。
    • 我发现了问题,我把:"cd /home/oracle/testscript ; . ./test.sh " + "\"" + entry +"\"" 换成了 "/home/oracle /testscript/test.sh " + "\"" + entry +"\"" 非常感谢您的回复/回答!!!
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 2021-12-25
    • 2014-06-14
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多